public class One {
public One foo(){
return this;
}
}class Two extends One{
public Two foo(){
return this;
}
}class Three extends Two{
public Three foo(){
System.out.println("three");
return this;}
}想请教一下,一般来说 方法覆盖时返回类型需要保持一致,
那在这里为什么返回类型可以用子类呢?
是不是和方法实现的 return this 有关?java
public One foo(){
return this;
}
}class Two extends One{
public Two foo(){
return this;
}
}class Three extends Two{
public Three foo(){
System.out.println("three");
return this;}
}想请教一下,一般来说 方法覆盖时返回类型需要保持一致,
那在这里为什么返回类型可以用子类呢?
是不是和方法实现的 return this 有关?java
协变返回
协变返回的基本用法是用于在已知一个实现的返回类型比API更具体的时候避免进行类型强制转换。在下面这个例子中,有一个返回Animal对象的Zoo接口。我们的实现返回一个AnimalImpl对象,但是在JDK 1.5之前,要返回一个Animal对象就必须声明。: public interface Zoo { public Animal getAnimal(); } public class ZooImpl implements Zoo { public Animal getAnimal(){ return new AnimalImpl(); } }
协变返回的使用替换了三个反模式:
直接字段访问。为了规避API限制,一些实现把子类直接暴露为字段:
ZooImpl._animal另一种形式是,在知道实现的实际上是特定的子类的情况下,在调用程序中执行向下转换:
((AnimalImpl)ZooImpl.getAnimal()).implMethod();我看到的最后一种形式是一个具体的方法,该方法用来避免由一个完全不同的签名所引发的问题:
ZooImpl._getAnimal();