gpt4 book ai didi

scala - 为什么 Scala 的不可变 Set 在其类型上不是协变的?

转载 作者:行者123 更新时间:2023-12-03 05:02:06 27 4
gpt4 key购买 nike

编辑:根据原始答案重写此问题

scala.collection.immutable.Set类的类型参数不是协变的。为什么是这样?

import scala.collection.immutable._

def foo(s: Set[CharSequence]): Unit = {
println(s)
}

def bar(): Unit = {
val s: Set[String] = Set("Hello", "World");
foo(s); //DOES NOT COMPILE, regardless of whether type is declared
//explicitly in the val s declaration
}

最佳答案

由于集合背后的概念是函数,

Set 的类型参数是不变的。以下签名应该可以稍微澄清一些事情:

trait Set[A] extends (A=>Boolean) {
def apply(e: A): Boolean
}

如果 SetA 中是协变的,则 apply 方法将无法采用 A 类型的参数> 由于函数的逆变性。 Set 可能在 A逆变,但是当您想要执行以下操作时,这也会导致问题:

def elements: Iterable[A]

简而言之,最好的解决方案是保持事物不变,即使对于不可变的数据结构也是如此。您会注意到 immutable.Map 的类型参数之一也是不变的。

关于scala - 为什么 Scala 的不可变 Set 在其类型上不是协变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/676615/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com