【发布时间】:2020-04-18 07:36:10
【问题描述】:
我有以下类,它在其构造函数中传递其类型的类:
class Foo<T>{
Foo(Class<T> clazz){
//do something
}
}
我的问题是,如果我想让 T 成为泛型类型,我不能将它的类作为参数传递,除非我使用原始类型:
Foo<List> f = new Foo(List.class);
这可以编译,但是如何更改构造函数以实例化Foo<List<Integer>> 类型的对象?
Foo<List<Integer>> f1 = new Foo(List.class);
不起作用,因为 List != List<Integer> 而我不能做 List<Integer>.class 因为类型擦除。我现在正在做的是未经检查的演员阵容,但必须有更好的方法:
Foo<List<Integer>> f2 = (Foo<List<Integer>>)new Foo(List.class);
我想用它来方便地通过反射封装字段访问。这是我如何使用它的示例:
class StaticField<V> {
private final Field field;
StaticField(Class<?> declaringClass, String fieldName, Class<V> valueClass){
//instantiate field and do some error handling including an
//assertion whether field.getType() == valueClass
}
public V get(){...}
public void set(V value){...}
}
【问题讨论】:
-
在 Foo 中作为参数传递的类是什么?
-
您正在寻找 Jackson
TypeReference或 GuavaTypeToken。 -
@JBNizet 我必须在我的项目(一个视频游戏模组)中使用大量反射,所以我创建了一个方便的类来封装对私有或最终字段的访问。类型 T 是引用字段的类型。该类用于在构造函数中检查字段的类型是否正确。我在帖子中添加了更详细的代码。