维基百科将covariance
定义为
从更宽的(动物)转变为更窄的(猫)。
但在Java
等语言中,返回类型协方差定义为将子类型分配给超类型,如:
public Animal getAnimal(){
return new Cat();
}
这里,我们将子类型分配给超类型但是根据Wikipedia
定义,协方差是为子类型分配超类型。我怎样才能调和这两个?
答案 0 :(得分:2)
您对协变返回类型的含义存在误解。
仅在重写方法时才有意义,它不引用return语句中使用的类型或调用者对方法的期望。 协变返回类型意味着您可以覆盖子类型中的方法并在覆盖期间更改返回类型(使其返回类型比超类型中的方法更窄)。
示例:
public class SuperType {
public Animal getAnimal() { ... }
}
public class SubType extends SuperType {
public Cat getAnimal() { ... }
}
这里维基百科的定义匹配。
Java Language Specification在section 8.4.8.3(c.f。example 8.4.8.3-1)中确认了这一点。
请注意,对于方法参数,Java需要逆变类型。如果getAnimal
在Animal
中使用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)
您应该尝试按以下方式查看:
方法是说:“我会给你一个动物” 如果它后来给你一只猫它没有撒谎。从较宽的类型到较窄的类型。