面试题答案
一键面试- 使用反射获取泛型参数类型:
- 在Java中,可以通过反射获取泛型参数类型。首先定义泛型接口
DataProcessor<T>
:
- 在Java中,可以通过反射获取泛型参数类型。首先定义泛型接口
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;
}
}
- 代码解释:
- 在
ComplexDataProcessor
的构造函数中,通过getClass().getGenericInterfaces()[0]
获取实现的泛型接口。 - 然后将其转换为
ParameterizedType
,通过getActualTypeArguments
获取实际的泛型参数类型。 - 在
transform
方法中,可以利用获取到的type
进行类型检查,确保传入的input
是List<Integer>
类型,从而维护类型安全。
- 在
- 使用场景示例:
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类型擦除的情况下,尽可能维护了泛型类型安全。