为什么不在Scala中编译?
def fun[T: Seq](arg: T) = {
val aValue: Seq = arg
}
在Intellij上我得到:
Expression of type T doesn't conform to expected type Seq
如果arg
属于T
类型,即Seq
,而aValue
是Seq
,则该分配是否可行?< / p>
答案 0 :(得分:2)
你的类型绑定错了。
[T : Seq]
是上下文绑定,用作获取隐式类型类参数的捷径,而Seq不是类型类。
示例强>
import Numeric.Implicits._
def add[T : Numeric](left: T, right: T) = left + right
是
的缩写def add[T](left: T, right: T)(implicit numeric: Numeric[T]) = numeric.plus(left, right)
您可能想要做的是:
def fun[T <: Seq](arg: T) = {
val aValue: Seq = arg
}
其中[T <: Seq]
是上层类型绑定,基本上意味着 T是Seq 或 T继承自Seq 或 T是Seq 的子类型(感谢Victor Moroz,请参阅scala-lang.org。)
修改强>
但是,Seq
采用项类型的类型参数。所以要么你不关心项目类型:
def fun[T <: Seq[_]](arg: T) = {
val aValue: Seq[_] = arg
}
或者你把它作为fun
的第二种类型参数:
def fun[A, T <: Seq[A]](arg: T) = {
val aValue: Seq[A] = arg
}
这些类型参数通常可以由编译器推断,因此您不必在调用时显式传递类型参数:
fun(List(1, 2, 3))