我有这个简单的代码:
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
。你不觉得这是一个愚蠢的主张吗?我已声明了返回值,因此部分应用的函数无法正常工作。编译器应该看到它。
答案 0 :(得分:3)
这看起来好像是java.util.List
已经定义了自己的toArray
方法。它定义了toArray():Object
和toArray(T[]):T[]
。因为它们可用,所以它不会隐式转换为Scala List
。但是Java toArray()
上的List
方法没有预期的返回类型,所以它需要使用一个接受一个参数的方法(使用泛型返回类型),这就是为什么你收到此错误消息。
如果您显式转换为Scala List
,那么它应该找到所需的toArray
方法,并按预期工作。所以代码应该是这样的:
import java.util
import scala.collection.JavaConverters._
def f(x: util.List[Int]): Array[Int] = {
x.asScala.toArray[Int]
}