我在声明空集合时遇到问题 - 我无法使用Nil
因为它会生成一个子类型...
def partiallyReduceString[S <: SeqLike[String, S]](reduction: String, seq: S): (String, S) =
if (seq.nonEmpty)
...
else
(reduction, Nil)
我也尝试了CanBuildFrom
,但我只是编译错误...
def partiallyReduceString ... (implicit bf: CanBuildFrom[S, String, S]): (String, S) =
if (seq.nonEmpty)
...
else
(reduction, bf().result())
无法使用String类型的元素构造S类型的集合 基于S类型的集合。
答案 0 :(得分:2)
问题是你的元组的第二个元素应该是S类型,它可以被视为SeqLike集合,但不能反过来。所以即使是bf在这种情况下也无济于事。
另一点是,无论你在结果中放置什么,S都可以是List
或Array
类型,但是在编译时无法查看。您可能希望通过指定一种独立创建S类型的空集合的方法来定义另一个约束。
import scala.collection.SeqLike
implicit val emptyList = () => List()
implicit val emptyArray[T] = () => Array[T]()
def partiallyReduceString[S <: SeqLike[String, S]](reduction: String, seq: S)(implicit empty: () => S): (String, S) = {
if (seq.nonEmpty)
???
else
(reduction, empty())
}