由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。
有一种变通的实现方式:
import java.lang.reflect.Array
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type
public class Generic extends Base<String>{
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<T>{
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<T>是泛型类,在父类中声明getGenericType,子类继承具体的Base<String>,那么在子类中就可以通过getGenericType(0)获取到String的class.
不知道我对你的题目的理解对不对:有个方法返回一个 泛型 ,你想去这个 泛型 的类型是不是?
package testimport java.util.ArrayList
import java.util.List
public class Test01 {
public static void main(String[] args) {
List<String> strings = new ArrayList<String>()
strings.add("123")//模拟返回一个泛型
System.out.println(strings.getClass())//第一次取类型
System.out.println(strings.get(0).getClass())//假如通过第一步知道是ArrayList类型,则再取类型
}
}
输出结果:
class java.util.ArrayList
class java.lang.String
这里只举例讲一下方法,不知道是不是你想要的,
获取java泛型中的对象类型,可以参考如下代码:
/**
* 通过反射取到 List<T> 中 T 的类型
* @param clazz
* @param field
* @return
*/
public static Class<? extends Object> getGenericType(Class<? extends Object> clazz, Field field){
Method getMethod = getGetMethodByField(clazz,field)
ParameterizedType pt= (ParameterizedType)getMethod.getGenericReturnType()
Class<? extends Object> type = (Class<?>)pt.getActualTypeArguments()[0]
//System.out.println(type.getSimpleName())
//System.out.println(type.getPackage())
return type
}