Java内部类的类引用

7
有没有一种方法可以引用任何内部类?
我想指定一个与内部类兼容的返回类型,例如。
Class<OuterClass.*> some_method();

我知道这个语法是无效的。有没有一种表达方式?

我知道我不能使用类似于 Class<? extends OuterClass> 这样的方法,因为内部类不会继承外部类。


2
你为什么想这样做?这不会增加任何类型安全性。 - SLaks
1
是的,您可以创建一个继承外部类的内部类,不是吗? - sp00m
内部类只是定义位置的问题。你也可以问如何将类型绑定到包。 - Bohemian
我的问题是,为什么Eclipse要求导入内部类? class OuterClass <T extends InnerClass> {public static class InnerClass {}},解决方法在answer中。 - Aquarius Power
5个回答

5

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

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

除此之外,返回任意内部类的对象有什么好处呢?与返回任何对象相比,这将增加内部实例与外部实例之间的特殊关系。但是,您可能无法直接使用那种特殊关系。 编辑: 正如其他人已经指出的那样,InnerClass 可能是其他内部类扩展的超类。这将允许您返回扩展该类的任何类。 如果使用接口,则不仅限于内部类,因为对于此限制,您需要非静态内部接口。 但是,默认情况下,内部接口是静态的。

我认为静态内部类仅可用于其外部类中。 - Eugen Martynov
1
@EugenMartynov 不,你也可以使用非静态内部类。 - Thomas
但是InnerClass并没有继承InnerClass,这对于OuterClass的其他内部类将不适用,我认为这就是OP想要的。 - Nandkumar Tekale
Class<OuterClass.*> 表示 OuterClass 的任何内部类。 - Nandkumar Tekale
@Nandkumar 这是真的,但 InnerClass 也可以是一个接口。关键是:如果不实现特殊接口或扩展另一个内部类,则不可能实现这一点。据我所理解,OP 的问题是是否有可能在内部声明 任何 内部类而不使用类本身的特殊标记。 - Thomas
@Nandkumar 另外,使用接口不会限制您只能返回 OuterClassinner 类。您也可以返回实现该接口的任何其他类。这可能不是 OP 想要的。 - Thomas

3
我更倾向于定义一个(内部)接口,让所有的内部类实现它,然后:
Class<OuterClass.MyInterface> someMethod();

相比于尝试引用任何内部类,这种方法可以更加类型安全。而且,当你需要另一个内部类来进行其他用途时,或者决定提取类时,你不会遇到任何问题。


很遗憾,不支持内部接口。必须是内部基类。 - Thomas
@Thomas 你说的“不支持内部接口”是什么意思?它们通常被使用,并且非常有用于定义回调。 - Denys Séguret
@dystroy 你是对的。我的测试例子骗了我,内部类的内部接口不被支持。 :) 此外,其他类也可以实现内部接口,无需它们成为内部接口。 - Thomas

0

没有这样的东西。就像你不能使用通配符引用包一样:

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

这种声明的使用情况非常有限,它甚至不可能出现在JLS中。请注意,您也不能在泛型范围之外使用这种“位置匹配类型”。例如,您不能声明:
void some_method(OuterClass.*  argument);
void some_method(com.example.* argument);

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{

    }

}

0
Java中允许使用

Class<InnerClass>。你是在寻找特定的内容吗?

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接