首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法理解逆方差wrt Function1(-T1,+T1)

无法理解逆方差wrt Function1(-T1,+T1)
EN

Stack Overflow用户
提问于 2015-11-08 15:29:37
回答 2查看 69关注 0票数 1

我无法理解逆方差wrt函数类型1,函数type1的定义如下:

Function1(-T,+T)

定义清楚地说明了输入类型参数是逆方差。所以一个类型的超类类型应该被允许作为参数。但是为什么这会给编译器带来错误呢?

我已经定义了下面的类

代码语言:javascript
复制
 class Animal 
  class Mammal extends Animal 
  class Cow extends Mammal  

我已经定义了如下方法

代码语言:javascript
复制
def move(m:Mammal) = Unit c 

当我像下面这样调用move时,它不会给出错误

代码语言:javascript
复制
 move (new Cow) 

但这会产生错误

代码语言:javascript
复制
move(new Animal)

为什么我不能使用Animal作为参数来调用move(),即使Function1是逆变量-T。

我是Scala的新手,所以请在这方面帮助我

EN

回答 2

Stack Overflow用户

发布于 2015-11-08 17:58:33

逆方差并不意味着可以为函数提供“较低”类型的值,而是在比较两个函数的类型时

代码语言:javascript
复制
type F = Function1(A, B)
type G = Function1(C, B)

如果AC的超类型,那么F就是G的子类型。本质上,函数类型的排序(方差)与类型在其输入位置的排序(相反)相反。

特别是当你想象一个函数的时候:

代码语言:javascript
复制
def foo(f : Cow => String) : String = f(new Cow)

然后从foo主体的角度来看,f可以接受Cow,但是从foo的调用者的角度来看,接受Animal的函数也可以接受Cow,因此允许这样做是有意义的:

代码语言:javascript
复制
foo((a : Animal) => "generic animal noise")
foo((c : Cow) => "moo")

在英语中,函数foo的约定是:

给我一个东西,当我给它一个Cow时,我会得到一个String,作为回报,我会给你一个String

特别是一个函数,当给定一个Animal时,它提供一个String,它符合“当给定一个Cow时,返回一个String的事物”的要求。

票数 2
EN

Stack Overflow用户

发布于 2015-11-08 17:05:38

实际上,可以直观地理解的本质是:你不能通过Animal的实例来移动,因为函数移动可能依赖于一些在Mammal中定义的方法,但在Animal中是缺失的。

希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33591717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档