Java 细化子类中方法的返回类型
假设我有以下两门课:Java 细化子类中方法的返回类型,java,generics,Java,Generics,假设我有以下两门课: 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
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()方法将从A.f()调用。但是,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?我在泛型方面做了很多工作,但一直碰壁
不必重写类B中的f()方法,有没有办法让A.f()返回A,而B.f()返回B
唯一的问题是问题的最后一行代码。换衣服
B b2 = b1.f();
// to
A b2 = b1.f();
我想你被自己的代码绊倒了。
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();
}
}
当co variant
create
隐藏在非co variantf
后面时,编译器无法“运行”f函数并证明它总是返回一个B。您还必须重写f()
-您的版本调用一个返回a
的方法
public class B extends A {
@Override
protected B create() {
return new B();
}
@Override
public B f() {
return create();
}
}
我在这里没有看到任何与遗传学有关的东西。@Dave d'oh,谢谢。。。我把这归咎于自动更正我喜欢自动更正。今天我发布了“它是你傲慢中唯一的垃圾”而不是“它是你代码片段中唯一的标签”。