TgetClass()或者Tclass都是非法的,因为T是泛型变量。
由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。
有一种变通的实现方式:
import javalangreflectArray;
import javalangreflectParameterizedType;
import javalangreflectType;
public class Generic extends Base<String> {
public static void main(String[] args) {
Generic c = new Generic();
Systemoutprintln(carray);
}
Object array ;
public Generic() {
array = ArraynewInstance(getGenericType(0), 100);
}
}
class Base<T> {
public Class getGenericType(int index) {
Type genType = getClass()getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Objectclass;
}
Type[] params = ((ParameterizedType) genType)getActualTypeArguments();
if (index >= paramslength || index < 0) {
throw new RuntimeException("Index outof bounds");
}
if (!(params[index] instanceof Class)) {
return Objectclass;
}
return (Class) params[index];
}
}
其中Base<T>是泛型类,在父类中声明getGenericType,子类继承具体的Base<String>,那么在子类中就可以通过getGenericType(0)获取到String的class
使用“is + as“ *** 作:
let x:Any = "abc"if x is String, let y = x as String {
// y 已经是字符串类型,并且值是“abc“
}
List<Object> list = new ArrayList<Object>();
listadd(new String("aaa"));
Systemoutprintln(listget(0)getClass()getName());
输出的值是javalangString,这样就能取得泛型的具体类型,不知道你是不是要这个意思
Class clazz1 = Stringclass;
Class clazz2 = persongetClass(); //sout(person); //xxxyyyzzzPerson@
Class clazz3 = ClassforName(String classPath);//体现反射的动态性
以上就是关于如何获得java 泛型类中T的实例全部的内容,包括:如何获得java 泛型类中T的实例、swift怎么获取一个实例的类型、如何获得java 泛型类中t的实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)