2

我有这个简单的代码:

import java.util
import scala.collection.JavaConversions._

def f(x: util.List[Int]): Array[Int] = {
  x.toArray[Int]
}

它失败了error: missing arguments for method toArray in trait List

但是,源代码toArray如下:

trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
...
  def toArray[B >: A : ClassTag]: Array[B] = {
    if (isTraversableAgain) {
      val result = new Array[B](size)
      copyToArray(result, 0)
      result
    }
    else toBuffer.toArray
  }

很明显,没有遗漏的论点。

1)这怎么可能?有简单的解决方法吗?还是我错过了什么?

2) 错误信息以 继续follow this method with '_' if you want to treat it as a partially applied function。你不觉得这是一个愚蠢的提议吗?我已经声明了返回值,所以部分应用的函数不能工作。编译器应该看到它。

4

1 回答 1

3

这看起来是由于java.util.List已经定义了它自己的toArray方法造成的。它定义了toArray():ObjecttoArray(T[]):T[]。因为这些是可用的,所以它不会隐式转换为 Scala List。但是toArray()Java 上的方法List没有预期的返回类型,因此它需要使用带单个参数的方法(具有通用返回类型),这就是您收到此错误消息的原因。

如果您对 Scala 进行显式转换List,那么它应该会找到所需的toArray方法,并按预期工作。所以代码应该是这样的:

import java.util
import scala.collection.JavaConverters._

def f(x: util.List[Int]): Array[Int] = {
  x.asScala.toArray[Int]
}
于 2015-03-05T20:07:05.577 回答