【问题标题】:Generics Erasure泛型擦除
【发布时间】:2011-11-29 12:10:15
【问题描述】:

我想知道如果 Java 有没有擦除的泛型,为什么会有问题。我知道问题在于与旧库的兼容性,但是将 Object 放在我们不会指定它的类型的位置不是很好。例如,我们有List list = new ArrayList(); 可以用作List<Object>-s 集合,List<Integer> list = new ArrayList<Integer>(); 将保持不变。

有人可以举例说明如果不进行擦除会发生什么。

【问题讨论】:

  • 我不确定你理解什么是擦除类型...
  • 您的问题不清楚。此外,您似乎将原始类型与具体类型混淆了。

标签: java generics type-erasure


【解决方案1】:

这仍然需要重新编译这些旧库,然后才能在新的 JVM 上使用——这正是 Java 设计者一直不惜一切代价避免的那种破坏性变化。

【讨论】:

  • 当然新的 Java 代码不能在旧的 JVM 上运行,但这意味着旧的代码不能在新的 VM 上运行?
  • @George:我就是这么说的,是的。
  • 是的,我知道新的不会在旧的。很明显,1.5 之前的 jvm 和编译器不知道泛型,但它与库有什么关系。这是对“Thinking in Java”的引用 如果没有某种迁移路径,随着时间的推移构建的所有库都有可能与选择迁移到 Java 泛型的开发人员隔绝。
  • 对不起迈克尔,我知道了。谢谢。
【解决方案2】:

您可以找到了解 Java 泛型(特别是类型擦除)的最佳资源之一是 Angelika Langer 的 FAQ 关于该主题的,看看它,一切都会清楚。

【讨论】:

    【解决方案3】:

    这不仅仅是向后兼容性的问题,而是migration compatibility。正如您正确指出的那样,1.5 之前的每个列表实际上都是List<Object>,因此定义List := List<Object> 本来可以工作并且向后兼容。但是,将现有库迁移到 1.5 并将隐式 List<Object> 转换为 List<Foo> 会破坏客户端代码。输入原始类型..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      相关资源
      最近更新 更多