如何在方法中返回一个期望称为协方差的超类型的子类型?

时间:2012-11-13 08:05:57

标签: java covariance

维基百科将covariance定义为

  

从更宽的(动物)转变为更窄的(猫)。

但在Java等语言中,返回类型协方差定义为将子类型分配给超类型,如:

public Animal getAnimal(){
   return new Cat();
}

这里,我们将子类型分配给超类型但是根据Wikipedia定义,协方差是为子类型分配超类型。我怎样才能调和这两个?

4 个答案:

答案 0 :(得分:2)

您对协变返回类型的含义存在误解。

仅在重写方法时才有意义,它不引用return语句中使用的类型或调用者对方法的期望。 协变返回类型意味着您可以覆盖子类型中的方法并在覆盖期间更改返回类型(使其返回类型比超类型中的方法更窄)。

示例:

public class SuperType {
  public Animal getAnimal() { ... }
}

public class SubType extends SuperType {
  public Cat getAnimal() { ... }
}

这里维基百科的定义匹配。

Java Language Specificationsection 8.4.8.3(c.f。example 8.4.8.3-1)中确认了这一点。

请注意,对于方法参数,Java需要逆变类型。如果getAnimalAnimal中使用SuperType类型的参数,则类SubType无法将此参数缩小为Cat,但可以将其扩展为(例如) Object

答案 1 :(得分:1)

通用术语“共变体”意味着两个实体可以沿轴变化,并且它表明实体是相关的,这样当一个实体创建一个 zig 时,另一个实体也会产生一个< EM>锯齿。相反,“反差”意味着当一个人制造一个 zig 时,另一个会产生一个 zag

具体来说,在类型理论中,如果我们缩小一个,另一个也缩小了,那么两种类型是共变的。

将它应用于Java返回类型,当我们从一个类转到它的子类时,方法的返回类型可以采用相同的方式:从类到子类。

将此与对方法参数有意义的对比:从类步进到子类,参数类型可以从类步进到超类。 Java中不存在此功能,但如果确实如此,这将是它的工作方式。

答案 2 :(得分:0)

如上所述,维基百科的协方差定义与Java函数的作用相同。该函数返回一个动物,但在这种情况下,它将它缩小到一个猫(因此更多变化)。

根据维基百科的定义,你可能会出错,协方差是为子类型指定超类型“。因为这与从较宽的(动物)转换为较窄的(Cats)不同,但完全相反。

//This is covariance, as you go from wider, to narrower
Animal someAnimal = new Animal();
someAnimal = getAnimal(); //now someAnimal is a cat, as by your code example.

答案 3 :(得分:0)

您应该尝试按以下方式查看:

方法是说:“我会给你一个动物” 如果它后来给你一只猫它没有撒谎。从较宽的类型到较窄的类型。