【问题标题】:Type erasure interferes with polymorphism类型擦除会干扰多态性
【发布时间】:2016-06-02 03:49:34
【问题描述】:

我在阅读 Core Java Volume I 时遇到了翻译泛型表达式的问题。这就是这本书所说的。

我不明白为什么会有干扰。对于突出显示的句子,为什么调用 setSecond(Object) 方法?既然interval是一个DateInterval对象,不应该是setSecond(Date)方法吗?

【问题讨论】:

  • “类型擦除会干扰多态性” ...就像“继承破坏封装”。然而,这些系统描述得很好,这些不便的事实并不妨碍那些知道如何使用它们的人。
  • 那本书中的例子相当混乱。老实说,我什至不明白它是如何说明这一点的。查看“为什么还需要它?”下的示例。这里:stackoverflow.com/questions/5007357/java-generics-bridge-method

标签: java generics type-erasure


【解决方案1】:

我认为主要问题是括号之间的所有内容(在这种情况下)仅在您编写代码时才存在。这是一个编译时检查。这就是类型擦除的全部内容。当您编译代码时,您所拥有的只是字节码中对 Object 和这些桥接方法的引用。

【讨论】:

  • 是的,我明白这一点,但是书中指出删除后 DateInterval 类中的 setSecond 方法仍然是 setSecond(Date),所以它不应该为 DateInterval 对象调用该方法而不是 setSecond(Object )?
  • 不,因为 pair 被声明为 Pair(它是只包含 setSecond(Object) 的超类),甚至被分配给 DateInterval(具有 setSecond(Date) 的子类)
  • 好吧,我还是有点困惑。所以这就是它干扰多态性的原因吗?我认为动态绑定会选择 setSecond(Date) 因为interval是一个DateInterval。我是不是想错了?
  • 你没有错。它必须调用setSecond(Date),但问题是超类中没有setSecond(Date),只有setSecond(Object),所以编译器创建了这个桥接方法,使子类实际上继承了setSecond(Object),但作用只是就像一个代理调用正确的方法,即 setSecond(Date)
  • 我认为你必须再读一遍这本书,问问自己为什么编译器必须创建桥接方法:-) 桥接方法是类型擦除冒犯多态的结果:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多