说我有以下两个类:
public class A {
protected A create() {
return new A();
}
public A f() {
return create();
}
}
public class B extends A {
@Override
protected B create() {
return new B();
}
}
因此,如果我在A的实例上调用f(),它将返回另一个A.如果我在B的实例上调用f(),它将返回另一个B,因为B.create()方法将是从Af()调用。但是,B上的f()方法被定义为返回A类型的对象。所以这段代码不会编译:
A a1 = new A();
B b1 = new B();
A a2 = a1.f();
B b2 = b1.f(); //Type mismatch: cannot convert from A to B
无需覆盖B类中的f()方法,有没有办法让A.f()返回A,而B.f()返回B?我用仿制药搞砸了很多东西,但一直在撞墙。
答案 0 :(得分:1)
无需覆盖B类中的f()方法,有没有办法让A.f()返回A,而B.f()返回B?
唯一的问题是你问题的最后一行代码。只需改变
B b2 = b1.f();
// to
A b2 = b1.f();
答案 1 :(得分:0)
我认为你已经绊倒了自己的代码。 create
函数与f
函数混淆了您。以下编译:
class demo {
public class A {
protected A create() {
return new A();
}
}
public class B extends A {
protected B create() {
return new B();
}
}
void d() {
A a1 = new A();
B b1 = new B();
A a2 = a1.create();
B b2 = b1.create();
}
}
当共同变体create
隐藏在非共变f
后面时,编译器无法“运行”f
函数并证明它总会返回乙
答案 2 :(得分:0)
您还必须覆盖f()
- 您的版本会调用返回A
的方法。
public class B extends A {
@Override
protected B create() {
return new B();
}
@Override
public B f() {
return create();
}
}