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
}
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
}
Here是很好的教程,它展示了如何以及何时使用反射来读取泛型。例如,从您的冷杉获取字符串foo
方法
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 =类java.lang.String
这是可能的,因为你的在源代码中明确声明List只能包含字符串。然而,在案件
public <T> void foo2(List<T> s){
//reflect s somehow to get T
}
T可以是任何东西,是因为类型擦除是不可能的检索提供精准的T类信息。
没有。由于Java的Type Erasure,所有泛型在编译过程中被剥离。
但是,您可以在列表中的元素上使用instanceOf
或getClass
以查看它们是否与特定类型匹配。
但是你仍然可以做在该领域同样的事情,所以信息存储在某处... – Bober02 2012-08-03 15:52:25
字段是不同的,因为它们的确切泛型类型静态存储在类文件中。约翰是正确的:你不能这样做。 – 2012-08-03 15:55:52
你到底想用s完成什么?你能告诉我一个简单的例子(伪代码无关紧要) – 2012-08-03 16:00:59
有了泛型,你可以做一些类似于public void foo T>(List s),如果这就是你想要的 –
2012-08-03 16:02:56