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
的更强大版本)。
答案 0 :(得分:2)
public Class<?> loadClass(String name) throws ClassNotFoundException
返回Class<?>
通用类your type information is lost here
。因此,您必须对所需的类型进行类型转换。
答案 1 :(得分:0)
使用通用签名编译类时,有关泛型的所有信息都将丢失。对于jvm,它就像:
class MyClass implements List {
// ...
}
如果你用javap
反编译一个类,你可以检查一下:你会看到没有通用的东西。泛型主要用于编译时间检查。因此,当您使用反射加载类时,您必须将其强制转换为通用版本。