这个问题在这里已有答案:
- 获取java.util.List的泛型类型 14个答案
2605
2017-10-08 16:21
起源
你能展示更多代码吗?目前尚不清楚这里发生了什么。如果方法适用 List,有理由它不会起作用 Collection。 - Rohit Jain
即使你确实获得了该字段的泛型类型,也没有太多可以使用它。你的情况是什么目的? - Sotirios Delimanolis
Rohit Jhon - 代码适用于List但不适用于Collection。在运行时它说Collection不能转换为ParameterizedType(正如我在问题中提到的)。 Sotirious Delimanolis - 这段代码的目的是生成代码,以便了解泛型的类型 - Gumba
@Gumba。你有嵌套的参数化类型吗?就像是 List<Collection<String>>?姓氏是 耆那教不是 JHON。 - Rohit Jain
答案:
你的方法很好。它应该适用于两者 List<String>
和 Collection<String>
。例如,请参阅此示例代码:
public class Demo {
List<String> list = new ArrayList<>();
Collection<String> coll = new ArrayList<>();
public static void main(String args[]){
Class<Demo> clazz = Demo.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field: fields) {
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType)type;
Type[] arr = pType.getActualTypeArguments();
for (Type tp: arr) {
Class<?> clzz = (Class<?>)tp;
System.out.println(clzz.getName());
}
}
}
}
}
打印出来:
java.lang.String
java.lang.String
12
2017-10-08 16:35
据我所知,Java完全擦除了类型,因此编译后的代码没有为参数类型赋值的痕迹。所有参数类型都转换为具体类型,包括类型转换和类似的东西
在我到目前为止看到的代码中,当一个类需要知道其泛型类型的值时,它会强制将该类型(或类)的对象作为参数传递。 就像是:
class A<T> {
private final Class<T> parameterType;
public A(Class<T> parCls) {
parameterType = parCls;
}
public A(T tObj) {
parameterType = tObj.getClass();
}
}
1
2017-10-08 16:32
正如我在我的问题中提到的,我知道java擦除,但我管理(正如你在我的代码中可以看到的)从List类型中获取通用。 - Gumba
这是类型参数,而不是您为其分配的值。 - Giulio Franco
您需要使用它定义的任何类型来解析ParameterizedType。例如,使用 TypeTools:
class Foo<T> {
public T bar;
}
class StringFoo extends Foo<String> {}
Type barType = Foo.class.getDeclaredField("bar").getGenericType();
Class<?> t = TypeResolver.resolveRawClass(barType, StringFoo.class);
assert t == String.class;
这里的价值 T
在StringFoo中定义,所以我们可以使用 TypeResolver
使用来解析字段类型的原始类 StringFoo
0
2017-10-31 22:31