相关疑难解决方法(0)

参数类型不是反变体吗?

我理解术语协方差和反方差.但是有一件小事我无法理解.在课程"Scala中的功能编程"课程中,Martin Ordersky提到:

函数在其参数类型中是逆变的,在它们的返回类型中是共变量的

所以例如在Java中,让我们Dog扩展Animal.让一个函数是:

void getSomething(Animal a){
Run Code Online (Sandbox Code Playgroud)

我有函数调用

Dog d = new Dog();
getSomething(d)
Run Code Online (Sandbox Code Playgroud)

所以基本上发生的事情就是这样Animal a = d.根据维基的协方差是"将范围扩大到狭窄".上面我们正在从狗转变为动物.SO不是参数类型协变而不是逆变?

java scala

17
推荐指数
1
解决办法
1466
查看次数

函数在其参数类型中是逆变的,在它们的返回类型中是共变量的

在发布这个问题之前,我已经阅读了这个这个答案,但我对这个主题的理解仍然有点不清楚,如下所述:

我理解协变和逆变独立意味着什么.

如果我有以下课程:

class Car {}
class SportsCar extends Car {}
class Ferrari extends SportsCar {}
Run Code Online (Sandbox Code Playgroud)

和:

object covar extends App {

    // Test 1: Works as expected

    def test1( arg: SportsCar => SportsCar ) = {
        new SportsCar
    }

    def foo1(arg: Car): Ferrari = { new Ferrari }
    def foo2(arg: SportsCar): Car = { new Ferrari }
    def foo3(arg: Ferrari): Ferrari = { new Ferrari }

    test1(foo1) // compiles
    test1(foo2) // Fails due to wrong …
Run Code Online (Sandbox Code Playgroud)

scala covariance contravariance

9
推荐指数
1
解决办法
1241
查看次数

标签 统计

scala ×2

contravariance ×1

covariance ×1

java ×1