gpt4 book ai didi

scala - 对不可变集合使用上限

转载 作者:行者123 更新时间:2023-12-03 08:20:12 26 4
gpt4 key购买 nike

我正在尝试创建一个方法,该方法可以采用 immutable.Seq 的任何后代的类型参数。这是我到目前为止得到的:

def writeSomeData[Holder[_] <: Seq[String]](path: String, holder: Holder[String]): Unit = {
// irrelevant implementation
}

但是,当我使用 immutable.List 调用上述方法时:

writeSomeData(tmp, List(res1, res2, res3, res4, res5))

它因以下错误而中断:

[error] /home/v.gorcinschi/repos/...: inferred type arguments [List] do not conform to method writeSomeData's type parameter bounds [Holder[_] <: Seq[String]]
[error] writeSomeData(tmp, List(res1, res2, res3, res4, res5))
[error] ^
[error] /home/v.gorcinschi/repos/...: type mismatch;
[error] found : List[String]
[error] required: Holder[String]
[error] writeSomeData(tmp, List(res1, res2, res3, res4, res5))

为什么会发生这种情况?我该如何纠正? List 是 Seq 的后代,不是吗? enter image description here

最佳答案

问题是 Holder[_] <: Seq[String]并不意味着你认为它的作用。我实际上不确定这是什么意思,可能类似于:trait Holder[A] extends Seq[String]正如您所看到的,这与 List 的外观非常不同。

你实际上想表达Holder[String]应该是 Seq[String] 的子类型许多人认为正确的语法是 Holder[_] <: Seq[_]然而,这也是不正确的;这只是意味着 Holder 必须扩展 Seq 但不能保证 Holder[String] <: Seq[String]
值得庆幸的是,Scala 确实提供了表示这一点的语法:Holder[x] <: Seq[x]x不是另一个类型参数,只是表示 Holder[x] 的一种方式。是 Seq[x] 的子类型适用于任何类型 x

有时,使用通用类型约束也更容易,例如:

def foo[Holder[_]](holder: Holder[String])(implicit ev: Holder[String] <:< Seq[String]): Unit

表示完全相同的关系。


尽管如此,只有在返回类型中引用Holder时,这才有用,如果您只想使用任何Seq,那么您可以这样做:

def foo(holder: Seq[String]): Unit

感谢 Liskov,您可以传递 Seq[String] 的任何子类型那里。

关于scala - 对不可变集合使用上限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68071617/

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