Java中有没有办法反映泛型类型的局部变量?我知道你应该用一个字段来表达 - Get generic type of java.util.List。任何想法如何解决,例如:
public void foo(List<String> s){
//reflect s somehow to get String
}
甚至更一般:
public void foo<T>(List<T> s){
//reflect s somehow to get T
}
答案 0 :(得分:6)
否即可。由于Java Type Erasure,在编译过程中会删除所有泛型。
但是,您可以对列表中的元素使用instanceOf
或getClass
,以查看它们是否与特定类型匹配。
答案 1 :(得分:1)
Here是一个很好的教程,展示了如何以及何时可以使用反射读取泛型类型。例如,从您的第一个foo
方法获取String
public void foo(List<String> s) {
// ..
}
您可以使用此代码
class MyClass {
public static void foo(List<String> s) {
// ..
}
public static void main(String[] args) throws Exception {
Method method = MyClass.class.getMethod("foo", List.class);
Type[] genericParameterTypes = method.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
if (genericParameterType instanceof ParameterizedType) {
ParameterizedType aType = (ParameterizedType) genericParameterType;
Type[] parameterArgTypes = aType.getActualTypeArguments();
for (Type parameterArgType : parameterArgTypes) {
Class parameterArgClass = (Class) parameterArgType;
System.out.println("parameterArgClass = "
+ parameterArgClass);
}
}
}
}
}
输出: parameterArgClass = class java.lang.String
这是可能的,因为在源代码中显式声明List只能包含字符串。但是如果
public <T> void foo2(List<T> s){
//reflect s somehow to get T
}
T可以是任何东西,因为类型擦除,无法检索有关精确T类的信息。