java - 我可以在 Java 中的 ArrayList<T> 实例上使用类字段吗?

标签 java generics reflection

我有这段代码,可以编译:

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/

相关文章:

c# - 使用运算符 <、<= 等测试两个对象

c# - System.Reflection 如何访问类成员数据/信息?

java - 如何使用反射检查对象的通用类型?

java - 从实现 Serializable 的旧 Java 类中删除字段

java - Python:指定相同的通用参数类型

java - 改造 void 方法以返回其参数以促进流畅性 : breaking change?

java - 强制 child 使用自己定义的枚举

delphi - 如何检查某项是否支持通用接口(interface)?

java - 如何将存储在 AWS S3 服务器中的 sqlite 数据库远程连接到我的 Android 应用程序

java - jquery/javascript : download a file from any webserver