在IntelliJ中运行的Scala代码在Scala的REPL中失败

时间:2018-10-25 20:07:56

标签: scala intellij-idea

在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)
                                                                                                  ^

2 个答案:

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