如何正确加载实现参数化接口的类?

时间:2012-09-14 09:40:36

标签: java reflection

Class<List>Class<List<?>>Class<List<Anything>实际上指的是同一个Class

但是,如果我有

class MyClass implements List<SomeClass> {
    // ...
}
然后我可以写

Class<? extends List<SomeClass>> myClass = MyClass.class;

然后允许我写

List<SomeClass> myInstance = myClass.newInstance();

诀窍是我希望使用ClassLoader.loadClass通过反射加载此类,并仍然使用相同的类型声明myClass。最合适/最简单的方法是什么?

我想要一个不会引发编译警告并且不需要@SuppressWarnings的解决方案(这可能意味着对超类型进行运行时检查,比如Class.asSubclass的更强大版本)。

2 个答案:

答案 0 :(得分:2)

 public Class<?> loadClass(String name) throws ClassNotFoundException

返回Class<?>通用类your type information is lost here。因此,您必须对所需的类型进行类型转换。

答案 1 :(得分:0)

使用通用签名编译类时,有关泛型的所有信息都将丢失。对于jvm,它就像:

class MyClass implements List {
    // ...
}

如果你用javap反编译一个类,你可以检查一下:你会看到没有通用的东西。泛型主要用于编译时间检查。因此,当您使用反射加载类时,您必须将其强制转换为通用版本。