【问题标题】:Java and property overloadJava 和属性重载
【发布时间】:2018-11-14 18:05:38
【问题描述】:

我在 debian 9 上使用 eclipse 2018-12 (4.10) / Java 11 遇到了这个问题

让我们声明我有一个基类

class A {

   private typeA prop;

   TypeA getProp(){
      return this.prop;
   }
}

还有一个派生的

class B extends A{
 private typeB prop;

 TypeB getProp(){
    return this.prop;
}

我希望 B 类中的道具隐藏 A 类中的道具,但在 Eclipse 中,我在 B 类中收到了 getProp 方法的错误消息: 返回类型与A.getProp()不兼容

有什么想法吗?

【问题讨论】:

  • 你覆盖了getProp;以不同的方式命名它们。
  • 如果返回类型不同,任何方法都不会被覆盖。
  • 除了您的代码无法编译的问题之外,您还有一个返回TypeB 的方法,并且您正尝试返回typeB 类型的变量。你也缺少分号。
  • 我只是不想命名不同..为什么 B 类中的 getProp() 不会重载 A 类中的 getProp ?
  • 这将完全破坏多态性和 Liskov 原则。 A 有一个返回 TypeA 的 getProp()。 B 扩展了 A。所以 B 的任何实例都是 A 的实例。因此在 B 实例上调用 getProp() 必须返回 TypeA:这是 A 类的约定。只需使用这段代码,它应该可以工作:@987654326 @。您的代码将使这成为不可能。

标签: java inheritance properties field


【解决方案1】:

通过TypeA继承使用JB Nizet注释解决-> TypeB

【讨论】:

    【解决方案2】:

    你可以尝试使用这样的接口:

    interface Type {
        // ...
    }
    
    class TypeA implements Type {
        // ...
    }
    
    class TypeB implements Type {
        // ...
    } 
    
    class A {
    
       private TypeA prop;
    
       Type getProp(){
          return this.prop;
       }
    }
    
    class B extends A {
    
        private TypeB prop;
    
        Type getProp(){
            return this.prop;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-12
      • 2013-05-18
      • 2011-06-17
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多