【问题标题】:Reference Type Equality at compile time编译时引用类型相等
【发布时间】:2019-12-05 19:56:23
【问题描述】:

我在 Java Language Specification-8 中遇到了以下语句。它指出 2 个类在编译时是相同的,如果:

  1. 它们具有相同的二进制名称(外部类的规范名称)。
  2. 它们的类型参数相同(如果有)。

Java Spec Doc

但是为什么编译器会为

引发重复的类错误
class Test<String>{
    ...
}

class Test<Integer>{
    ...
}

这里的二进制名称相同,但参数类型不同。我在这里缺少什么?

【问题讨论】:

  • 这是相同的类名,但它们的泛型类型参数具有不同的任意名称。 StringInteger 是您自己混淆选择的标识符;他们不是java.lang.Stringjava.lang.Integer。无论你想做什么,这都不是办法。
  • 如果我将 Test 更改为 Test 并将 Test 更改为 Test
  • 不是关于引用类型的文档吗?这并不是说 2 个 是相同的,而是说 2 个 reference types 类似于 private List&lt;String&gt; myList 中的 myList 的类型。肯定和private List&lt;Integer&gt; myList 中的不一样(private 添加只是为了澄清,所以很明显这是定义一个字段,对于局部变量也是如此)

标签: java reference


【解决方案1】:

不是参数,而是泛型类的Type。此类型信息在运行时被删除,因此从 JVM 的角度来看它是相同的。

您可以在Oracle docs 中阅读有关GenericsType Erasure 的更多信息。

【讨论】:

  • 感谢您的回答!什么是类的类型参数?
  • 它允许对某些类型不可知,如果类型对实现无关紧要,即Lists 不关心它们携带哪种对象。我在上面的Generic Type 描述中添加了一个链接。
猜你喜欢
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2014-12-21
  • 1970-01-01
相关资源
最近更新 更多