我在查看边界方面遇到了一些麻烦。我编写了以下函数,它应该将任何对象seq
视为Seq[T]
,如果为空则返回None
,否则返回Some(seq)
。
def noneIfEmpty[T, S <% Seq[T]](seq: S): Option[S] =
if (seq.isEmpty) None else Some(seq)
让我们定义函数......
scala> def noneIfEmpty[T, S <% Seq[T]](seq: S): Option[S] = ...
noneIfEmpty: [T, S](seq: S)(implicit evidence$1: S => scala.collection.immutable.Seq[T])Option[S]
好的,功能签名看起来正确。我们试试一个空列表......
scala> noneIfEmpty(List())
res54: Option[List[Nothing]] = None
到目前为止一切顺利。现在让我们尝试一个非空的列表......
scala> noneIfEmpty(List(1,2,3))
res55: Option[List[Int]] = Some(List(1, 2, 3))
大。数组怎么样?
scala> noneIfEmpty(Array())
<console>:15: error: No implicit view available from Array[Nothing] => scala.collection.immutable.Seq[Any].
noneIfEmpty(Array())
^
不太好。这里发生了什么?是否存在从Array[T]
到WrappedArray[T]
的隐式转换? scala.Predef.wrapRefArray
不应该照顾这个吗?
答案 0 :(得分:3)
你在某个地方有导入scala.collection.immutable.Seq
吗?
在*ArrayOps
中定义了一系列名为scala.Predef
的隐式视图,将Array[T]
转换为scala.collection.mutable.ArrayOps[T]
,而不是immutable.Seq
。
scala> def noneIfEmpty[S <% collection.Seq[_]](seq: S): Option[S] =
| if(seq.isEmpty) None else Some(seq)
noneIfEmpty: [S](seq: S)(implicit evidence$1: S => Seq[_])Option[S]
scala> noneIfEmpty(Array[Int]())
res0: Option[Array[Int]] = None
scala> noneIfEmpty(Array[Int](1, 2, 3))
res1: Option[Array[Int]] = Some([I@7c92fffb)