gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:48 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com