面试题答案
一键面试- 对于这种情况,可以通过获取类的
ParameterizedType
来获取实际的泛型类型。以下是示例代码:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
class GenericClass<T> {}
class Main {
public static void main(String[] args) {
GenericClass<String> genericClass = new GenericClass<>();
Type genericSuperclass = genericClass.getClass().getGenericSuperclass();
if (genericSuperclass instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println("实际的泛型类型: " + actualTypeArgument);
}
}
}
}
- 在上述代码中:
- 首先获取
GenericClass
实例的genericSuperclass
,这将返回该类的直接超类的Type
对象。 - 检查
genericSuperclass
是否为ParameterizedType
,如果是,说明该类是参数化类型(即包含泛型)。 - 然后通过
ParameterizedType
的getActualTypeArguments
方法获取实际的泛型类型参数,并将其打印出来。
- 首先获取
需要注意的是,如果GenericClass
不是直接继承自Object
(例如继承了另一个泛型类),上述代码获取的是其直接超类的泛型参数。如果要获取GenericClass
本身声明的泛型参数,需要从类的声明处获取,如下代码:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
class GenericClass<T> {}
class Main {
public static void main(String[] args) {
Type genericType = GenericClass.class.getGenericSuperclass();
if (genericType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println("实际的泛型类型: " + actualTypeArgument);
}
}
}
}
这种方式获取的是GenericClass
声明的泛型参数,而不依赖于具体实例化的对象。不过在实际应用中,获取实例化时传入的泛型类型更常见。