如何解决Scala:无法将数组传递给需要 Seq 或 Iterable 的函数
我试图编写一个泛型函数,它接受一个类型参数 T,它是 Seq[String] 的一个子集,下面是示例
def test[T <:Seq[String]](c:T):T = {
c
}
我定义了一个变量,它是 Array[String]
val b = Array("test")
现在我期待它可以工作,但是,我收到如下错误
scala> test(b)
^
error: inferred type arguments [Array[String]] do not conform to method test's type parameter bounds [T <: Seq[String]]
^
error: type mismatch;
found : Array[String]
required: T
我尝试将 T 定义为 Iterable[String] 的子集,但这也不起作用。
我知道 Scala 中的 Array 不是 Seq,但我希望它被隐式转换为 WrappedArray 和这个函数仍然有效。有人可以帮我看看这有什么问题吗?
解决方法
我知道 Scala 中的 Array 不是 Seq,但我希望它被隐式转换为 WrappedArray 并且这个函数仍然可以工作。有人可以帮我看看这有什么问题吗?
这是什么问题:
我希望它被隐式转换为 WrappedArray
你希望它不会让它成为真的。只有 Scala Language Specification 中写的内容是真实的。
Section 3.2.6 Parameterized Types 表示“如果每个实际类型参数符合其边界,则参数化类型是良构的”。
而 Section 3.5.2 Conformance 定义了“符合”的含义,并且没有在任何地方提及隐式转换。
因此,Array[String]
不符合 Seq[String]
,因此不是形式类型参数 T
的有效实际类型参数。
要返回与接收到的相同的集合类型,包括 Array
,您必须使用一些特殊的类型类。
这是一个(不是特别好)的例子。 (Scala 2.13.x)
import scala.collection.Factory
import scala.collection.generic.IsIterable
def test[CC[_]](c:CC[String]
)(implicit isit: IsIterable[CC[String]] {type A = String},fac : Factory[String,CC[String]]
): CC[String] =
isit(c).map(_.reverse).to(fac)
test(Array("abc")) //res0: Array[String] = Array(cba)
test(Vector("Go","Jo")) //res1: Vector[String] = Vector(oG,oJ)
test(List("my","dad","Bob")) //res2: List[String] = List(ym,dad,boB)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。