【问题标题】:The return types are incompatible for the inherited methods返回类型与继承的方法不兼容
【发布时间】:2012-05-08 11:33:35
【问题描述】:
  class A {
        public A get() { }
 }

 class B extends A {

 }

返回类型与继承的方法不兼容, 如何解决这个问题?

【问题讨论】:

  • 您使用的是什么版本的 Java?
  • 对不起,更正了示例;@
  • 你想写像B b = new B().get();这样的东西而不显式转换?
  • 不确定您要完成什么,但您粘贴的代码 sn-p 无法编译。 public A get() 有一个返回类型,但对初学者没有返回任何内容...
  • 哪些返回类型?带有行号的整个编译器消息,以及它们所指的位置。做一个简短的例子,我们可以重现错误。

标签: java oop inheritance types incompatibility


【解决方案1】:

从 JDK 5 开始,Java 允许您更改被覆盖方法的返回类型,只要新类型是原始类型的子类即可。 这称为covariant return type。 以下代码将正确编译:

class A {

    A get() {
        return new A();
    }

    void sayHello(){
        System.out.println("Hello");    
    }
}

class B extends A {

    @Override
    B get() {
        return new B();
    }

    void sayGoodbye(){
        System.out.println("Goodbye");
    }
}

class Test{
    void check(){
        B two=new B();
        two.get().sayGoodbye();
    } 
}

请记住,被覆盖方法的返回类型应该是返回类型的子类,以允许您在 A 变量上调用该方法并获取有效的 A 对象(实际上是 B 实例):

        void check(){
            A two=new B();
            A copy=two.get();
            copy.sayHello();
        }   

【讨论】:

    【解决方案2】:

    使用泛型:

     class A<T extends A> {
            public T get() { }
     }
    
     class B extends A<B> {
    
     }
    
    B b = new B();
    B got = b.get();
    

    【讨论】:

      【解决方案3】:

      我假设您想编写类似 B b = new B().get(); 的东西,而不像 Nikita Beloglazov 所建议的那样进行显式类型转换,尽管这不是 Java 支持的惯用语。尤金的回答效果很好,尽管这仍然涉及到T 的转换,并且还会产生一个丑陋的编译器警告。就个人而言,我会编写更像以下的代码:

      class A {
          private A() {}
      
          public A get() {
              return new A();
          }
      }
      
      class B extends A {
          private B() {}
      
          @Override
          public A get() {
              return new B();
          }
      
          public B getB() {
              return (B) get();
          }
      }
      

      你仍然不能做B b = new B().get();,但你可以做B b = new B().getB();,这同样简单而且更自我记录,因为你已经知道你想要一个B对象,而不仅仅是任何A 对象。 A a = new B().get(); 会创建一个 B 对象,尽管它只能访问 A 中声明的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 2014-08-29
        • 2016-05-28
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多