【问题标题】:Why T in "K <: T" can't be covariance?为什么“K <:T”中的T不能是协方差?
【发布时间】:2014-04-29 15:57:16
【问题描述】:

Scala 代码:

class Cat[T] {
    def meow[K <: T] = ""
}

class Cat[-T] {
    def meow[K <: T] = ""
}

它们可以被编译。

但是当T为协方差时,以下代码无法编译:

class Cat[+T] {
    def meow[K <: T] = ""
}

编译器打印:

error: covariant type T occurs in contravariant position in type  <: T of type K
       def meow[K <: T] = ""
                ^

&lt;:右边的类型一定不能协变?为什么?

【问题讨论】:

  • T in “K &lt;: T” can't be covariance 仅在负数位置可用。

标签: scala type-systems type-bounds


【解决方案1】:

这样不好

Jazz &lt;: MusicClassical &lt;: Music,但JazzClassical之间没有关系,

meow[K &lt;: T] 表示Cat[Music] 可以喵喵叫JazzClassical 或任何类型的选择。

另一方面,Cat[Classical] 喵不能是Jazz

但是如果你有协变的Cat[+T],那么一个Cat[Classical] &lt;: Cat[Music],那么一个Cat[Classical],也是一个不拘一格的Cat[Music],应该可以喵喵叫Jazz

矛盾。

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 2015-09-08
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2018-03-22
    • 2023-03-11
    相关资源
    最近更新 更多