Java Generics Type Argument as Variable可能吗?

时间:2016-02-18 13:57:32

标签: java generics

是否可以通过变量?:

为泛型类提供类型参数
private static final Class clazz = String.class;

ArrayList<clazz> list = new ArrayList<>();

在此示例中,我收到编译器错误。那为什么不可能呢?

2 个答案:

答案 0 :(得分:4)

就像@Jesper所说,你正试图跨越编译时和运行时范围。

首先,要了解Java泛型是一个严格的编译时功能 - 一旦你的java源代码被编译为字节代码,那么&#39;泛型&#39;正如你在消息来源中看到的那样消失了。我建议您阅读type erasure了解有关此主题的更多信息。

那么编译器对泛型做了什么?它验证转换和操作是否安全,然后自动将各种操作插入到已编译的代码中。这就是问题所在 - 您要求编译器根据运行时提供的参数执行操作。要点是,由于编译器无法访问运行时值,因此无法编译泛型并发生错误。

很好地讨论了为什么Java Generics在未经具体化的情况下被设计@ Neal Gafter's Blog

答案 1 :(得分:0)

编译器不能为其泛型类型提供动态值,因为在运行时,您可以将String换成另一种类型,但突然之间它不应该编译,但它已经太晚了,因为它正在运行!执行此操作的正确方法是使用接口或抽象类来指示给定类型必须是该类的子类。

示例可能是ArrayList< ? extends Collection<?> >。这保证了类型可以用作Collection,因为该类型必须是Collection的子类。

See here如果你想阅读这个主题。