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 variant
f
后面时,编译器无法“运行”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,谢谢。。。我把这归咎于自动更正我喜欢自动更正。今天我发布了“它是你傲慢中唯一的垃圾”而不是“它是你代码片段中唯一的标签”。