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

解决方案 »

  1.   

    ,this返回当前类对象的成员变量,super则是返回父类的呗子类隐藏变量或则修改的方法。
      

  2.   

    “return 子类”是jdk5新添加的功能,jdk4之前是不可以的。
      

  3.   

    google一下:
    协变返回
      协变返回的基本用法是用于在已知一个实现的返回类型比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();