Java中 获取 T 类型 需要注意T类型只能在继承类里获取 比如
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Call<T> {
private Object obj;
public Call(Object obj) {
this.obj = obj;
}
public T getT() {
System.out.println(getTClass().getName());
if (obj.getClass().getName().equals(getTClass().getName())) {
return ((T) obj);
}
return null;
}
private Class<T> getTClass() {
Type t = getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) t).getActualTypeArguments();
Class<T> cls = (Class<T>) params[0];
return cls;
}
}
此时
String str = new Call(“Hello”).getT();
print(str);
则会报异常
异常信息为
Class无法强转为ParameterizedType
是因为泛型只能在继承类中获取 加个继承类
public class StringCall extends Call {
public StringCall(Object obj) {
super(obj);
}
}
此时
String str = new StringCall(“Hello”).getT();
print(str);
输出正常
Hello
此时
String str = new StringCall(“Hello”){}.getT();
print(str);
则会报异常
异常信息为
Class无法强转为ParameterizedType
虚拟机无法获取一个内部匿名类的T类型
Java机制 内部匿名类 传递的是当前类的类型 如下
public class Main {
public static void main(String[] args) {
String str = new StringCall(“Hello”){}.getT();
print(str);
}
}
StringCall的getT方法中 得到的类型值是
Main$1
没有T类型
以上