返回类型与继承方法不兼容
答
使用泛型:
class A<T extends A> {
public T get() { }
}
class B extends A<B> {
}
B b = new B();
B got = b.get();
答
我假设你想要写的东西像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
中声明的方法。
答
从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();
}
您使用的是哪个版本的Java? – 2012-04-27 17:44:53
对不起,纠正了这个例子; @ – nabil 2012-04-27 17:47:22
你想写'B b = new B()。get();'而不显式强制转换? – 2012-04-27 17:50:50