MST

星途 面试题库

面试题:Java泛型在反射中的深度应用

在Java中,通过反射获取泛型类型信息是一个复杂的任务。假设你有一个泛型类`GenericClass<T>`,其中有一个方法`void printType(T t)`,现在要求你通过反射机制,在运行时准确获取`T`的实际类型(如果该类被实例化为`GenericClass<Integer>`,则获取到`Integer`类型),请编写代码实现这一功能,并解释实现过程中遇到的挑战及解决方案。
36.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

代码实现

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

class GenericClass<T> {
    public void printType(T t) {
        // 空实现,仅为满足题目结构
    }
}

public class ReflectionGenericTypeExample {
    public static void main(String[] args) {
        GenericClass<Integer> integerGenericClass = new GenericClass<>();
        Class<?> genericClass = integerGenericClass.getClass();
        Type genericSuperclass = genericClass.getGenericSuperclass();
        if (genericSuperclass instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
            for (Type type : actualTypeArguments) {
                System.out.println("实际类型: " + type.getTypeName());
            }
        }
    }
}

实现过程中遇到的挑战及解决方案

  1. 挑战:Java的泛型是一种编译时机制,在运行时类型信息会被擦除,即GenericClass<T>在运行时变成GenericClass,无法直接获取泛型参数T的实际类型。
  2. 解决方案
    • 使用反射的ParameterizedType接口。通过getGenericSuperclass()方法获取泛型超类,然后判断其是否为ParameterizedType
    • 如果是ParameterizedType,可以通过getActualTypeArguments()方法获取实际的类型参数,这些参数就是泛型中具体的类型,从而实现运行时获取泛型类型信息。