2

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.

4

2 回答 2

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

当它返回Class<?> 通用类时,your type information is lost here. 因此,您必须将类型转换为所需的类型。

于 2012-09-14T09:56:53.497 回答
0

当你用泛型签名编译一个类时,所有关于泛型的信息都会丢失。对于 jvm,它就像:

class MyClass implements List {
    // ...
}

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

于 2012-09-14T10:21:33.590 回答