Why the type position of a method is marked as negative?
在上面的链接中, n.m。回答:
方法参数的方差位置与封闭参数子句的方差位置相反。
类型参数的方差位置与 封闭式参数子句的方差位置。
我不知道封闭参数条款或封闭式参数条款是什么。
你可举个例子解释一下吗?答案 0 :(得分:1)
我不知道封闭参数子句或封闭类型是什么 参数子句是。
规范在陈述关于方差的那些线之前定义了一个重要的公理:
让协方差的反面是逆变,而与之相反 不变性本身。 始终是类型或模板的顶级 在协变位置。方差位置在以下变化 构建体。
所以我们从类型参数的初始允许方差是协变的事实开始,现在我们根据特定上下文来回翻转方差(这里是一个例子,还有更多):
现在让我们再看看这些陈述:
方法参数的方差位置与 封闭参数子句的方差位置。
这基本上意味着如果我们有一个通用的方法参数,我们就会为它调整方差:
def m(param: T)
封闭参数子句是在方法m
之后和括号内定义的所有内容,在我们的例子中包括param: T
。 T
处于逆变位置,因为我们不得不翻转它(记住,所有顶级类型参数都在协变位置开始),这是由于规则(规则1)。
类型参数的方差位置与 封闭式参数子句的方差位置。
让我们用类型参数定义一个方法:
def m[T >: U]()
封闭类型参数子句引用方括号[T >: U]
。同样,方差因规则而翻转,因此U
现在处于逆变位置(规则2)。
您可以将其视为游戏。你有一个起始状态(协变或正面),然后是一组使位置切换的规则(协变 - >逆变,逆变 - >协变,不变 - >不变)。在游戏结束时,您有一个应用于类型参数的选定状态(位置)。
这blog post以一种可以推理的方式解释事物。
答案 1 :(得分:0)
我想我知道他的意思并试图说明。 鉴于以下先决条件:
trait A
trait B extends A
trait C extends B
val bs: List[B] = List(new B{}, new B{})
val b2b: B => B = identity
List[+T]
在其类型参数(包含类型参数子句)中是协变的,但它可分配给(封闭类型子句)的变量类型是逆变的:
val as: List[A] = bs // this is valid
val cs: List[C] = bs // ...and this is not
另一个例子涉及功能。 Function1[-T, +R]
在其参数中是逆变的,在其返回类型中是协变的,但在赋值给变量的情况是相反的:
val c2a: C => A = b2b // this compiles
val a2c: A => C = b2b // ...and this does not