从 java ArrayList 转换为 Scala Array 时,特征列表中的方法 toArray 缺少参数
Missing arguments for method toArray in trait List when converting from java ArrayList to scala Array
我有这个简单的代码:
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
。你不认为这是一个愚蠢的提议吗?我已经声明了 return 值,所以部分应用的函数无法工作。编译器应该能看到它。
这看起来是因为 java.util.List
已经定义了它自己的 toArray
方法。它定义了 toArray():Object
和 toArray(T[]):T[]
。因为这些可用,所以它不会隐式转换为 Scala List
。但是 Java List
上的 toArray()
方法没有预期的 return 类型,因此它需要使用接受单个参数的方法(使用泛型return 类型),这就是您收到此错误消息的原因。
如果您显式转换为 Scala List
,那么它应该会找到所需的 toArray
方法,并按预期工作。所以代码应该是这样的:
import java.util
import scala.collection.JavaConverters._
def f(x: util.List[Int]): Array[Int] = {
x.asScala.toArray[Int]
}
我有这个简单的代码:
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
。你不认为这是一个愚蠢的提议吗?我已经声明了 return 值,所以部分应用的函数无法工作。编译器应该能看到它。
这看起来是因为 java.util.List
已经定义了它自己的 toArray
方法。它定义了 toArray():Object
和 toArray(T[]):T[]
。因为这些可用,所以它不会隐式转换为 Scala List
。但是 Java List
上的 toArray()
方法没有预期的 return 类型,因此它需要使用接受单个参数的方法(使用泛型return 类型),这就是您收到此错误消息的原因。
如果您显式转换为 Scala List
,那么它应该会找到所需的 toArray
方法,并按预期工作。所以代码应该是这样的:
import java.util
import scala.collection.JavaConverters._
def f(x: util.List[Int]): Array[Int] = {
x.asScala.toArray[Int]
}