我见过类似的问题被问过几次,例如获取泛型类类型
构造静态泛型类型有正当理由。在op'的情况下,他可能希望
MyClass<String> result = doit(MyClass<String>.class);
如果没有语言语法支持,强制转换是正确的方法。如果经常需要这样做,则应将铸造放入一种方法中,例如
public class MyClass<T>
{
@SuppressWarnings("unchecked")
// may need a better method name
static public <T2> Class<MyClass<T2>> of(Class<T2> tClass)
{
return (Class<MyClass<T2>>)(Class<?>)(MyClass.class);
}
}
MyClass<String> result = doit(MyClass.of(String.class)); // no warning
在确保演员安全后,我们可以单独压制该方法的警告。任何呼叫站点都不会看到警告。
这都是编译时选角游戏。在运行时,所有类型参数都被擦除,实际上只有裸类对象被传递。该方法很可能会优化,因此对于JVM,最后一行只不过是of
MyClass result = doit(MyClass.class)
有时,在运行时,我们需要一个完整的类型。需要获取一个对象来表示 。MyClass<String>
ParameterizedType
MyClass<String>
当这两个要求组合在一起时,也就是说,我们需要一个编译时表达式,它将在运行时计算为MyClass
String
ParameterizedType
ParameterizedType type_MyClass_String = ???? MyClass ?? String ???
有一种技术涉及一个匿名子类MyClass<String>
ParameterizedType type_MyClass_String = superTypeOf( new MyClass<String>(){} );
我觉得这很令人不安。