问题标签 [erasure]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
159 浏览

java - ArrayList 中的类型擦除> 通用调用

有人可以解释为什么以下代码无法编译:

ArrayList<List<?>> arrayList = new ArrayList<List<String>>();

为什么上面的代码无效,但这个运行良好:

ArrayList<?> items = new ArrayList<List<String>>();

0 投票
2 回答
145 浏览

java - Gson 去串化列表和类,这里的擦除是如何工作的?

我打算编写一个通用方法将 json 列表转换为带有类的特定列表。这是通用的 json 解析器:

这是一个我想转换为 Json 并返回到 Pojo 的虚拟类。

这是一个简单的测试,看看它是否有效:

控制台输出如下:

我正在努力理解为什么fromJson(json, class)有效但fromJsonList(json, class)无效。如果擦除适用,那么它是否适用于两种情况?为什么第一种方法确定类是类型City而不是LinkedHashMap第二种情况?

0 投票
2 回答
116 浏览

java - 为什么擦除仍然允许覆盖/实现?

乍一看,我认为以下是有道理的:

并且它编译正确,所以一切看起来都很好。

但是后来我在擦除的上下文中考虑了更多,在我看来,测试接口被擦除为:

那么Impl如何仍然能够实现Test呢?

0 投票
0 回答
39 浏览

java - 为什么 Java 匿名类在运行时保留通用信息?

当我正在寻找一种方法来在运行时保留有关杰克逊的 JSON(反)序列化上下文中的泛型类型信息时,我发现确实可以使用TypeReference<T>.
然后,我想了解它的工作原理和原因,因此我点击了文档中的链接,该链接指向此处

我知道在某些情况下,例如匿名内部类,即使在运行时也可以知道类的泛型类型(我认为可以说类型擦除在这里并不完全适用),但我不知道'不明白为什么:如果它只适用于这种特殊情况,为什么还要添加这个(相当模糊的)功能?不要误会我的意思,拥有它相当方便,但为什么它首先存在呢?

0 投票
1 回答
87 浏览

scala - 如何区分参数类型?

我对 Scala 中的子类型感到困惑。我的主要问题是如何C[T1]区分C[T2]. 有两种情况:

  1. C[T1]“等于” C[T2],因为它们都是C.
  2. C[T1]不“相等” C[T2],因为C[T1]C[T2]最终是不同的类型。

我尝试了一些方法,例如.getClass,似乎这种策略不起作用,因为我们有原始类型。

我现在想知道有什么方法可以做到这一点吗?

0 投票
0 回答
16 浏览

java - Java 类型擦除:如何确保类型安全?

根据 Java 泛型中的类型擦除机制,一个方法:

..被编译为

但是那么如何保证类型安全呢?由于 add 现在需要 Object,我可以传递 String、Integer、Employee 等,因为它们都是 Object 的子类型。

0 投票
0 回答
49 浏览

java - 通用类/方法中多个有界类型的擦除与隐式转换

根据JLS§4.4

绑定中类型的顺序仅在因为类型变量的擦除由其绑定中的第一个类型确定,并且类类型或类型变量可能只出现在第一个位置时才有意义。

考虑以下代码段:

以下是我的一些疑问-:

  1. 擦除方法test(T t)=> test(C t)
    • 如果是这种情况 - 那么为什么我们在计算 Erasure 时要删除其他类型?
  2. T方法test(T t)=>中类型的隐式转换(C & I)
  3. 从理论上讲,擦除与隐式强制转换相同吗?
0 投票
1 回答
61 浏览

java - 通用数组初始化

我已经阅读了不同的文章,这些文章谈到了为什么我们不能在 java 中创建泛型数组,但我仍然不太明白为什么。

例如,在这篇文章中,它假设如果通用数组初始化是可能的,那么在擦除后将会出现强制转换问题。您可以在第2 节中找到详细信息。使用通用数组时的注意事项。简单来说,泛型数组擦除后变成了一个对象数组,如果泛型类型是String,java将无法将Object[]转换为String[]。

但是,我创建了一个具有简单函数的泛型类,

擦除后,getStringArr 应该返回 Object[],并且可以毫无问题地转换为 String[]。

另一个stackoverflow帖子指出:

数组(与泛型不同)在运行时包含有关其组件类型的信息。所以在创建数组的时候一定要知道组件的类型。由于您在运行时不知道 T 是什么,因此您无法创建数组。

但是擦除会T变成Object类型,所以编译器可以创建对象类型的数组。

还有其他类似解释的帖子,但不能真正解决我的疑问。

请帮忙!

0 投票
0 回答
38 浏览

java - 类中的重载方法必须具有不同的 Erasure - 为什么只有最左边的边界被认为是 Erasure 类型?

考虑以下两个方法定义:

两者都将分别具有以下擦除:

考虑具体的类和Doing接口DoDone

现在,当我尝试调用 methodwhatToDo时,即使方法在类中正确编译,也会出现模棱两可的调用编译错误。仅在调用时,我收到错误。

这是否意味着擦除的定义对异常负责,只有最左边的元素被视为给定有界类型的擦除?另外,为什么选择擦除是这种方式?JLS 定义擦除过程的方式是否有更好的方法?

理想的情况是Java不应该通过修改擦除的定义以包括无序的边界集而不是最左边的边界来允许在这种情况下存在这两种方法?

这是完整的代码: