【问题标题】:Generic type of local variable at runtime运行时局部变量的通用类型
【发布时间】:2012-08-03 15:40:50
【问题描述】:

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
}

【问题讨论】:

  • 你到底想用 s 完成什么?你能给我看一个简短的例子吗(伪代码无关紧要)
  • 使用泛型,你可以做一些类似 public void foo T> (List s),如果这是你想要的

标签: java generics reflection type-erasure


【解决方案1】:

。由于Java 的Type Erasure,所有泛型在编译过程中都会被剥离。

但是,您可以在列表中的元素上使用 instanceOfgetClass 以查看它们是否匹配特定类型。

【讨论】:

  • 但是你仍然可以在球场上做同样的事情,所以信息存储在某个地方......
  • 字段是不同的,因为它们的确切泛型类型静态存储在类文件中。约翰是对的:你不能这样做。
【解决方案2】:

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 类的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 2021-09-03
    • 2010-10-13
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多