7

有没有办法引用任何内部类?

我想指定一个与内部类兼容的返回类型,例如

Class<OuterClass.*> some_method();

我了解此语法无效。有没有办法表达这个?

我知道我不能使用类似的东西,Class<? extends OuterClass>因为内部类不扩展外部类。

4

5 回答 5

5

好吧,您至少可以参考特定的内部类:

<T extends OuterClass.InnerClass> Class<T> some_method()

除此之外,通过返回任何内部类的对象你会得到什么?这相当于返回任何对象加上内部实例与外部实例具有特殊关系的事实。但是,无论如何,您可能无法直接使用该特殊关系。

编辑:

正如其他人已经指出的那样,InnerClass可能是其他内部类扩展的超类。这将允许您返回任何扩展该类的类。

如果您使用接口,则不仅限于内部类,因为对于此限制,您需要非静态内部接口。但是,默认情况下,内部接口是静态的。

于 2012-08-22T12:03:07.410 回答
3

我宁愿定义一个(内部)接口,让所有内部类实现它,然后:

Class<OuterClass.MyInterface> someMethod();

这比试图引用任何内部类更安全。当您需要另一个内部类用于其他用途时,或者您决定提取一个类时,您不会有任何问题。

于 2012-08-22T12:04:36.973 回答
0

不,没有。就像您不能使用通配符引用包一样:

Class<com.example.*> some_method();
Class<com.example.?> some_method();

此类声明的用例将非常有限,以至于无法将其纳入 JLS。请注意,您也不能在泛型范围之外使用此类“位置匹配类型”。例如,您不能声明:

void some_method(OuterClass.*  argument);
void some_method(com.example.* argument);
于 2012-08-22T12:03:21.403 回答
0

您可以定义标记接口并通过内部类实现它。

<T implements CustomMarkerInterface> Class<T> some_method()

所以这将适用于所有内部类OuterClass

public class Outer {

    public class Inner implements CustomMarkerInterface{

    }

    public class Inner1 implements CustomMarkerInterface{

    }

    public class Inner2 implements CustomMarkerInterface{

    }

}
于 2012-08-22T12:07:24.493 回答
0

Class<InnerClass>在 java 中是允许的。您在寻找特定的东西吗?

public class Client
{
interface InnerType
{
}
public class InnerClass implements InnerType
{
}
public Class<? extends Client.InnerType> test()
{
    return InnerClass.class;
}

}
于 2012-08-22T12:07:40.540 回答