Java中定义泛型<T>时,怎么获得泛型的类型

Python018

Java中定义泛型<T>时,怎么获得泛型的类型,第1张

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<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 test

import 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

这里只举例讲一下方法,不知道是不是你想要的,