协变返回类型

继承过程中子类重写父类方法的现象

1.如下例

package net.oschina.tkj.chapter8.returntype;
/**
 * 协变返回类型
 * @author Freedom
 *
 */
public class Grain {

	public String toString(){
		return "grain";
	}
}

package net.oschina.tkj.chapter8.returntype;
/**
 * 此时该类并未继承Grain 类
 * @author Freedom
 *
 */
public class Wheat {

	public String toString(){
		return "wheat";
	}
}

/**
 * WheatMilk的父类
 * @author Freedom
 *
 */
public class Milk {

	public Grain process(){
		return new Grain();
	}
}

package net.oschina.tkj.chapter8.returntype;
/**
 * Milk的子类
 * @author Freedom
 *
 */
public class WheatMilk extends Milk {

	/**
	 * 子类继承父类,子类重新定义了一个与父类方法名一样的方法但是返回值不一致,会出现调用不确定性编译出错
	 */
	public Wheat process(){
		
		return null;
	}
} 

上述代码编译时会报错:



 错误原因:子类继承父类的过程中,在子类中声明了一个与父类方法名一样但返回值不一样的方法,就会出现调用的不确定性。

2.协变返回类型

2.1将上列修改为如下情况:

package net.oschina.tkj.chapter8.returntype;
/**
 * 此时该类继承Grain 类
 * @author Freedom
 *
 */
public class Wheat extends Grain {

	public String toString(){
		return "wheat";
	}
}

 此时,将Wheat类继承Grain类,Milk类及其子类保持不变,此时编译器不在报错。

2.1协变返回类型

Java SE5之后,子类继承父类重写父类的方法,子类重写方法的返回类型可以是父类方法的返回类型或者是父类方法返回类型的子类型

猜你喜欢

转载自1498116590.iteye.com/blog/2404920