在Scala的REPL中键入此单行代码时,会看到以下内容,但是在IntelliJ中它可以正常工作。发生了什么事?
scala> def sum[T: Numeric](seq: Seq[T]): T = if (seq.size == 1) seq.head else seq.head + sum(seq.tail)
<console>:12: error: type mismatch;
found : Seq[T]
required: Seq[String]
def sum[T: Numeric](seq: Seq[T]): T = if (seq.size == 1) seq.head else seq.head + sum(seq.tail)
^
答案 0 :(得分:6)
您必须对Scala进行导入import Numeric.Implicits._
,以将+
标识为Numeric
的附加内容。通过导入,它也可以在控制台中使用:
scala> import Numeric.Implicits._
import Numeric.Implicits._
scala> def sum[T: Numeric](seq: Seq[T]): T = if (seq.size == 1) seq.head else seq.head + sum(seq.tail)
sum: [T](seq: Seq[T])(implicit evidence$1: Numeric[T])T
没有导入,Scala尝试使用隐式类+
中定义的Predef.any2stringadd
方法。此类是在Predef
中定义的,因此它会自动导入到任何Scala代码中。它将任何类型的第一个参数转换为String
,并期望第二个参数为String
。在您的情况下,它不是String
,因此不是错误消息。
答案 1 :(得分:1)
无论出于何种原因,您的Intellij-IDEA似乎都忽略了隐式转换丢失的导入(这可能是Intellij指定的行为,也可能是您在问题中省略的某些导入)。
这在Scala REPL中有效,并且还将隐式转换的范围保持为最小:
def sum[T](seq: Seq[T])(implicit num: Numeric[T]): T = {
import num._
if (seq.size == 1) seq.head else seq.head + sum(seq.tail)
}