我的项目包括反射,我目前正在处理泛型类型。 我已经设法从List(java.util.List)获取泛型类型:
if(originalField.getGenericType() instanceof ParameterizedType){
ParameterizedType pt = (ParameterizedType) originalField.getGenericType();
Class<?> subClass = (Class<?>) pt.getActualTypeArguments()[0];
}
我还有Collection<String>
,结果可以将 NOT 强制转换为ParameterizedType。
有人知道如何从集合中获取String(或任何类型)?
我一直在阅读关于java擦除的内容,所以我知道这一点,但是在将通用列表从列表中删除之后,我想也许有人知道另一个'技巧'。
感谢。
EDITED: 我正在迭代这个类的所有字段:
for (Field originalField : someClass.getDeclaredFields())
然后当我面对一些List<String>
字段时,使用上面的代码我将String
作为subClass变量。
答案 0 :(得分:12)
你的方法很好。它应该适用于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
答案 1 :(得分:1)
据我所知,Java完全删除了类型,因此编译后的代码没有为参数类型赋值的痕迹。所有参数类型都被转换为具体类型,包括类型转换和类似的东西
在我到目前为止看到的代码中,当一个类需要知道其泛型类型的值时,它会强制将该类型(或类)的对象作为参数传递。 类似的东西:
class A<T> {
private final Class<T> parameterType;
public A(Class<T> parCls) {
parameterType = parCls;
}
public A(T tObj) {
parameterType = tObj.getClass();
}
}
答案 2 :(得分:0)
您需要使用它定义的任何类型来解析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