【发布时间】:2018-08-26 07:22:45
【问题描述】:
我试图了解编译器如何检查类型参数的位置是协变的还是逆变的。
据我所知,如果类型参数使用 + 进行注释,也就是协变注释,那么任何方法都不能有使用该类/特征的类型参数类型的输入参数。
例如,bar 不能有 T 类型的参数。
class Foo[+T] {
def bar(param: T): Unit =
println("Hello foo bar")
}
因为bar()的参数位置被认为是负数,这意味着该位置的任何类型参数都处于逆变位置。
我很好奇 Scala 编译器如何找到类/特征中的每个位置是正面的、负面的还是中性的。好像有一些规则,比如在某些情况下翻转它的位置,但不能理解清楚。
另外,如果可能的话,我想知道这些规则是如何定义的。例如,在具有协变注释的类中定义的方法的参数,如Foo 类中的bar() 方法,似乎应该具有逆变类类型。为什么?
【问题讨论】:
-
您能否澄清您的问题:1.“似乎存在一些规则,例如在某些情况下翻转其位置” - 是什么让您这么认为? 2.“在具有协变注释的类中定义的方法的参数......应该具有逆变类类型。为什么?” - 你是在问为什么要引入方差规则,还是其他什么?顺便说一句,其实方法参数可以是逆变类型也可以是非变类型,不一定是逆变的。
标签: scala