Scala参数化函数不会编译

时间:2016-02-26 21:40:52

标签: scala types type-inference

为什么不在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,而aValueSeq,则该分配是否可行?< / p>

1 个答案:

答案 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))