12.7.2 覆写对返回值类型的要求

在判断是否进行覆写的三个条件中,最复杂的是之前介绍过的方法的类型签名,下面介绍返回值类型需要满足的条件。子类型中方法的返回值类型必须可以替代父类型中对应方法的返回值类型。当使用者通过父类型的对象引用来调用一个被覆写的方法时,所得到的实际是子类型方法的返回结果。而使用者是通过父类型中方法的返回值类型来引用方法的返回结果,这就要求子类型中方法的实际返回结果的类型可以替代父类型中方法声明的返回值类型。比如,父类型中方法的返回值类型是Object,子类所覆写的方法的返回值类型可以是String,这是因为String类型可以替代Object类型,反之则不行。

子类型中方法的返回值类型可以替代父类型中对应方法的返回值类型的情况比较多,典型的情况包括两个方法的返回值类型完全相同,以及前者是后者的子类型。在进行判断时可以使用在介绍类型系统中提到的泛型类型之间的父子类型的关系。代码清单12-26给出了使用包含通配符的参数化类型作为返回值类型的示例。父类型中method方法的返回值类型是List<?extends Serializable>,而子类型中方法的返回值类型实际上是List<?extends Number>。由于List<?extends Number>是List<?extends Serializable>的子类型,因此这是一个正确的方法覆写。

代码清单12-26 使用包含通配符的参数化类型作为返回值类型的示例


class GenericeSuperClass<T>{

public List<?extends Serializable>method(){

return null;

}

}

class GenericeSubClass<S extends Number>extends GenericeSuperClass<S>{

public List<S>method(){

return null;

}

}