gpt4 book ai didi

java - 如何使用java反射获取列表的泛型类?

转载 作者:行者123 更新时间:2023-11-30 08:17:00 26 4
gpt4 key购买 nike

我有一个局部变量列表或其他一些列表我想获取这个列表变量的泛型类。

该变量不是成员变量,因此不要使用 Field 来获取泛型类。

方法应该是

public Class<?> getGenericClass(List<E> list){

//somehow to return Class E

}
<小时/>

编辑:我尝试了@Radiodef的解决方案,但遇到了异常

java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class

Class genericClazz = (Class) pt .getActualTypeArguments()[0]行。

public static void main(final String[] args) throws IOException {
final List<String> list = new ArrayList<String>();
list.add("aaa");
final Type type = list.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
final ParameterizedType pt = (ParameterizedType) type;
final Class<?> genericClazz = (Class<?>) pt
.getActualTypeArguments()[0];
System.out.println(genericClazz.getName());
}
}

最佳答案

这是唯一可以做到的方法:

import java.lang.reflect.*;

static <E> Class<E> getClassE(List<E> list) {
Class<?> listClass = list.getClass();

Type gSuper = listClass.getGenericSuperclass();
if(!(gSuper instanceof ParameterizedType))
throw new IllegalArgumentException();

ParameterizedType pType = (ParameterizedType)gSuper;

Type tArg = pType.getActualTypeArguments()[0];
if(!(tArg instanceof Class<?>))
throw new IllegalArgumentException();

@SuppressWarnings("unchecked")
final Class<E> classE = (Class<E>)tArg;
return classE;
}

但是,List您传入的必须是具有具体类型的子类。

例如如果你打电话

... = getClassE( new ArrayList<String>() );

它会抛出:因为泛型是 erased ,所以Class<E>通常在运行时不可用。

通常,当使用此模式时,您会使用匿名子类,例如:

//                                       vv
... = getClassE( new ArrayList<String>() {} );

但你也可以这样做

class StringList extends ArrayList<String> {}
... = getClassE( new StringList() );

当我们创建这样的子类时,Class<E>被存储,我们可以通过我答案第一部分中的反射来检索它。

另请参阅:http://gafter.blogspot.com/2006/12/super-type-tokens.html .

Ideone 示例:http://ideone.com/O2Gztj .

关于java - 如何使用java反射获取列表的泛型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29512700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com