【发布时间】:2020-11-11 03:55:49
【问题描述】:
我在理解协方差类型受方法参数限制时感到困惑。我阅读了许多材料,但无法理解以下概念。
class SomeThing[+T] {
def method(a:T) = {...} <-- produces error
}
在上面这段代码中,a 是类型 T。为什么我们不能传递 T 的子类型?方法对参数 x 的所有期望,都可以通过 T 的子类型完美满足。
同样,当我们有逆变类型 T (-T) 时,它不能作为方法参数传递;但这是允许的。为什么我认为它不能通过是:例如,说 method 调用方法(存在于对象 a 中) 在 T 中存在的 a 上。当我们传递 T 的超类型时,它可能不存在。但它是编译器允许的。这让我很困惑。
class SomeThing[-T] {
def method(a:T) = {...} <-- allowed
}
因此,通过查看上述内容,在方法参数和返回类型中都应该允许协变。不能应用逆变。
谁能帮我理解一下。
【问题讨论】:
-
有 30 分钟? Here's a very recent video 关于这个话题。
标签: scala covariant contravariant