【问题标题】:Is it possible to override a method of a generic class in Java?是否可以在 Java 中覆盖泛型类的方法?
【发布时间】:2013-10-14 22:50:00
【问题描述】:

我知道在 C++ 中没有虚拟模板函数之类的东西。这是因为我们需要在编译时知道 VTBL 的条目,并且每个模板类型都是单独编译的。

然而,在 Java 中,我知道泛型类型只编译一次,这可以启用泛型类的覆盖方法。这是真的吗?

如果是这样,这个设计选择会导致什么?

【问题讨论】:

  • java中不叫模板
  • 它们被称为泛型
  • 您的意思是“这种设计选择有意义吗?”?
  • @aaronman - 你是对的。我的坏:)

标签: java c++ generics inheritance overriding


【解决方案1】:

Java 没有模板类。相反,它具有泛型,它们是常规 Java 类,在编译时具有额外的类型信息,允许编译器执行类型安全检查。完成这些检查后,有关泛型类型的信息将被“擦除”,编译后的类看起来就像任何其他类。

【讨论】:

  • 感谢您的回复。我知道类型擦除及其工作原理。我在问是否可以在子类中重写泛型类的方法(以及考虑这种情况是否有意义)。
  • @Shookie 没有模板类之类的东西,只是在编译时碰巧具有通用信息的常规类。这些方法可以像任何其他方法一样被覆盖(即,只要它们是可见的而不是final)。以AbstractList<E> 为例。
  • @Shookie 在 JDK 中有很多这样的例子。我建议您查看 List 和 Map 层次结构。
【解决方案2】:

任何非最终的、非私有的、非静态的方法都可以在子类中被覆盖,无论它是否是泛型的。之所以可行,是因为在每种情况下,类型实际上都是 reference。当您更改类型时,您只是更改了引用的类型。

顺便说一句,所有非静态方法在 Java 中都是“虚拟的”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多