当前位置: 首页 > 知识库问答 >
问题:

为什么不从下一个JVM中删除类型erasure?

谭卜鹰
2023-03-14

Java在Java5中引入了泛型的类型擦除,因此它们可以在Java的旧版本上工作。这是一个兼容性的折衷。从那以后,我们就失去了兼容性[1][2][3]--Bytecode可以在JVM的更高版本上运行,但不能在更早的版本上运行。这看起来可能是一个更糟糕的选择:我们丢失了类型信息,并且仍然无法在旧版本的JVM上运行为较新版本的JVM编译的字节码。怎么了?

具体地说,我想问的是,在JVM的下一个版本中为什么不能删除类型擦除(假设与以前的版本一样,它的字节码无论如何也不能在上一个版本上运行),是否有任何技术原因。

[3]:类型擦除可以以类似于retrolambda的方式对那些真正喜欢它的人进行备份。

编辑:我认为关于向后兼容和向前兼容定义的讨论模糊了这个问题。

共有1个答案

丌官高远
2023-03-14

在某种程度上,erasure将在将来与project valhalla一起删除,以支持值类型的专门实现。

或者更准确地说,类型擦除实际上意味着泛型没有类型专门化,valhalla将在基元上引入专门化。

具体地说,我想问的是,为什么在JVM的下一个版本中不能删除类型擦除,是否有任何技术原因

而且这也可能是一个兼容性问题,可能会有代码通过依赖类型擦除来执行未经检查的强制转换,从而滥用泛型集合,而类型擦除会在强制执行类型约束时中断。

 类似资料:
  • 问题内容: Java在Java 5中引入了带有泛型的类型擦除,因此它们可以在Java的旧版本上使用。这是兼容性的折衷。从那以后,我们就失去了兼容性–字节码可以在JVM的更高版本上运行,但不能在较早的版本上运行。这似乎是最糟糕的选择:我们丢失了类型信息,并且仍然无法在较旧版本上运行针对较新版本JVM编译的字节码。发生了什么? 具体来说,我是在问是否存在任何技术原因,导致无法在下一版JVM中删除类型擦

  • 问题内容: 我正在使用填充要在中列出的项目。一切正常。 但是现在我想保持项目列表的动态,即我希望能够在运行时从选择列表中添加/删除项目。但是,当我致电或时,我总是得到,即使该类的将这两种方法描述为可用于该预期目的也是如此。 这是一个错误,真的没有实现,还是我在这里遗漏了什么? 问题答案: 您可能使用普通的Java数组(例如,)初始化了适配器。尝试使用一些实现接口的东西(例如)。

  • 问题内容: 我知道可以通过deleteByQuery从某种类型删除所有文档。 例: 但是我没有术语,只是想删除该类型的所有文档,无论使用什么术语。什么是实现这一目标的最佳实践?空项不起作用。 链接到deleteByQuery 问题答案: 我相信,如果您将通过查询进行的删除与匹配相结合,则它应该做您想要的所有事情(例如,使用示例): 或者您可以删除类型:

  • 关于如何在Java代码中管理密码,有各种各样的问题和答案——例如,这里和这里。 讨论往往集中在使用< code>char[]而不是< code>String的优点上。 但是,如果是第三方库将密码存储在字符串中,有什么方法可以避免密码存储在JVM的堆中呢? 例如,在以下三种情况下,我认为密码将在JVM的生命周期内保留在堆中: 编辑-示例更新为与我的问题更相关: 在上面的示例中,我的对象在中包含密码。

  • 将jmeter测试集设置为使用10个线程组运行8小时,每个线程组具有不同的线程数,还使用每个线程组具有不同TPS速率的吞吐量成形计时器;在一段随机时间(大多数时间在6小时后)后,其中一个线程组终止活动线程,我尝试了不同的配置以及穿透输出成形计时器,比如使用Concurrency线程组和循环控制器,但结果是相同的;这是我在日志中看到的: 我们感谢您为解决此问题提供的任何帮助。

  • 问题内容: 最近,我回答了一个问题,OP希望将整个文本包装在元素中,而不是包装在其中的文本,所以就像这样 所以简单地给 不会删除包裹在元素内的文本的下划线 但这确实消除了下划线 因此,我制作了an 并成功了,这就是我通常的做法。但是,当涉及到解释时,我无法解释为什么这样做实际上会删除下划线,而仅仅使用了下划线。 问题答案: 在某些情况下,文本修饰从元素传播到某些后代。该规范描述了所有在此发生,不会