我有这段代码,可以编译:
new TypeToken<ArrayList<ServerTask>>() {}.getType()
那我试过了
ArrayList<ServerTask>.class
不编译。
我是 Java 编程的新手(来自 C#),我认为 T.class
完全等同于 typeof(T)
在 C# 中。显然有一些我不明白的非常基本的东西,所以我的问题是 ArrayList<ServerTask>.class
有什么问题?我别无选择,只能使用 new TypeToken<ArrayList<ServerTask>>() {}.getType()
反而?是否有更短(更好、更合理)的形式?
谢谢。
最佳答案
不幸的是(?)Java 使用Type Erasure 实现泛型。 .
这意味着没有获取泛型类型的构造,并且在运行时您的 ArrayList 实际上只存储对象。
确切地说,Java 中的泛型是一种仅在编译时构造的结构。它们仅在编译时保证类型安全。
编辑: 我刚刚注意到这段代码 -
new TypeToken<ArrayList<ServerTask>>() {}.getType()
这是针对类型删除限制的变通方法。如果您使用特定类型扩展通用类,则会保留类型信息。例如:
public interface List<T> {
}
public class StringList implements List<String> {
// The bytecode of this class contains type information.
}
在您的示例中,您正在扩展 TypeToken
类,导致编译器生成一个包含类型信息的匿名内部类。 TypeToken.getType()
的实现将使用反射为您提供此类型信息。
EDIT2:有关更详细的解释,请查看 Reflecting Generics .
关于java - 我可以在 Java 中的 ArrayList<T> 实例上使用类字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7511517/