2012-04-27 137 views
1
class A { 
     public A get() { } 
} 

class B extends A { 

} 

返回类型与继承方法不兼容 如何解决此问题?返回类型与继承方法不兼容

+3

您使用的是哪个版本的Java? – 2012-04-27 17:44:53

+0

对不起,纠正了这个例子; @ – nabil 2012-04-27 17:47:22

+1

你想写'B b = new B()。get();'而不显式强制转换? – 2012-04-27 17:50:50

回答

0

使用泛型:

class A<T extends A> { 
     public T get() { } 
} 

class B extends A<B> { 

} 

B b = new B(); 
B got = b.get(); 
0

我假设你想要写的东西像B b = new B().get();没有明确的类型转换喜欢尼基塔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中声明的方法。

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(); 
    } 
} 

记住,覆盖方法的返回类型应为返回类型的子类,允许你调用一个变量的方法,并得到一个有效的目的(其实际上是B实例):

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