T.getClass()或者T.class都是非法的,因为T是泛型变量。
由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。
有一种变通的实现方式:
import java.lang.reflect.Array;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Generic extends Base
public static void main(String[] args) {
Generic c = new Generic();
System.out.println(c.array);
}
Object array ;
public Generic() {
array = Array.newInstance(getGenericType(0), 100);
}
}
class Base
public Class getGenericType(int index) {
Type genType = getClass().getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
throw new RuntimeException("Index outof bounds");
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
}
其中Base
Java与C++不同,如果你在放进一个类以后想用new T()来创建一个实例,Java是无法实现的。这是因为Java有擦除机制,而且编译器不能验证T具有默认(无参)构造器。
解决方案是传递一个工厂对象,并且使用它来创建新的实例。最便利的工厂对象就是Class对象,因此如果使用类型标签,那么你就可以使用newInstance来创建这个类型的新对象。
具体查看Bruce.Eckel著《Java编程思想(第四版)》的383页。
c#中可以,但是java中貌似不行
java中需要实例化某个类的实例,需要知道类名称
Class.forName("xxx.xx.MyClass").newInstance()
public class Base
Class classType=T.class;
public Base(){
//想在这里 得到T的类对象 赋值给 classType
}
T.getClass()或 T.class,或class.forName(T.getClass().getName())