细化子类中方法的返回类型

时间:2011-09-27 22:18:31

标签: 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的实例上调用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?我用仿制药搞砸了很多东西,但一直在撞墙。

3 个答案:

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