MST
星途 面试题库

面试题:Java泛型接口在复杂场景下的类型擦除与类型安全维护

假设你有一个泛型接口`DataProcessor<T>`,其中定义了方法`T transform(T input)`。现在有一个类`ComplexDataProcessor`实现了`DataProcessor<List<Integer>>`接口。在运行时,由于Java的类型擦除机制,可能会引发类型安全问题。请详细说明如何在这种复杂场景下,通过反射或其他机制维护类型安全,同时给出相关代码示例。
23.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 使用反射获取泛型参数类型
    • 在Java中,可以通过反射获取泛型参数类型。首先定义泛型接口DataProcessor<T>
public interface DataProcessor<T> {
    T transform(T input);
}
  • 实现ComplexDataProcessor类:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class ComplexDataProcessor implements DataProcessor<List<Integer>> {
    private Class<List<Integer>> type;

    public ComplexDataProcessor() {
        Type superClass = getClass().getGenericInterfaces()[0];
        if (superClass instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) superClass;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
            if (actualTypeArguments.length > 0) {
                type = (Class<List<Integer>>) actualTypeArguments[0];
            }
        }
    }

    @Override
    public List<Integer> transform(List<Integer> input) {
        // 在这里可以利用获取到的type进行类型检查等操作,确保类型安全
        if (type != null &&!type.isInstance(input)) {
            throw new IllegalArgumentException("Input type is not List<Integer>");
        }
        List<Integer> result = new ArrayList<>();
        for (Integer num : input) {
            result.add(num * 2);
        }
        return result;
    }
}
  1. 代码解释
    • ComplexDataProcessor的构造函数中,通过getClass().getGenericInterfaces()[0]获取实现的泛型接口。
    • 然后将其转换为ParameterizedType,通过getActualTypeArguments获取实际的泛型参数类型。
    • transform方法中,可以利用获取到的type进行类型检查,确保传入的inputList<Integer>类型,从而维护类型安全。
  2. 使用场景示例
public class Main {
    public static void main(String[] args) {
        ComplexDataProcessor processor = new ComplexDataProcessor();
        List<Integer> data = new ArrayList<>();
        data.add(1);
        data.add(2);
        List<Integer> result = processor.transform(data);
        System.out.println(result);
    }
}
  • main方法中,创建ComplexDataProcessor实例,传入List<Integer>数据并调用transform方法,确保在运行时类型安全。

通过上述反射机制,在Java类型擦除的情况下,尽可能维护了泛型类型安全。