我无法理解逆方差wrt函数类型1,函数type1的定义如下:
Function1(-T,+T)
定义清楚地说明了输入类型参数是逆方差。所以一个类型的超类类型应该被允许作为参数。但是为什么这会给编译器带来错误呢?
我已经定义了下面的类
class Animal
class Mammal extends Animal
class Cow extends Mammal 我已经定义了如下方法
def move(m:Mammal) = Unit c 当我像下面这样调用move时,它不会给出错误
move (new Cow) 但这会产生错误
move(new Animal)为什么我不能使用Animal作为参数来调用move(),即使Function1是逆变量-T。
我是Scala的新手,所以请在这方面帮助我
发布于 2015-11-08 17:58:33
逆方差并不意味着可以为函数提供“较低”类型的值,而是在比较两个函数的类型时
type F = Function1(A, B)
type G = Function1(C, B)如果A是C的超类型,那么F就是G的子类型。本质上,函数类型的排序(方差)与类型在其输入位置的排序(相反)相反。
特别是当你想象一个函数的时候:
def foo(f : Cow => String) : String = f(new Cow)然后从foo主体的角度来看,f可以接受Cow,但是从foo的调用者的角度来看,接受Animal的函数也可以接受Cow,因此允许这样做是有意义的:
foo((a : Animal) => "generic animal noise")
foo((c : Cow) => "moo")在英语中,函数foo的约定是:
给我一个东西,当我给它一个Cow时,我会得到一个String,作为回报,我会给你一个String。
特别是一个函数,当给定一个Animal时,它提供一个String,它符合“当给定一个Cow时,返回一个String的事物”的要求。
发布于 2015-11-08 17:05:38
实际上,可以直观地理解的本质是:你不能通过Animal的实例来移动,因为函数移动可能依赖于一些在Mammal中定义的方法,但在Animal中是缺失的。
希望这能有所帮助
https://stackoverflow.com/questions/33591717
复制相似问题