2011-11-29 53 views
9

为什么所有使用java的scala可变参数方法似乎都接受变量的Seq,并且不能用作java本地可变参数方法。这是一个错误?例如,Buffer具有方法def append(elems: A*): Unit。但在Java中它有另一个签名:void append(Seq<A>)在java中使用scala可变参数的方法

回答

7

这是不是一个错误。这是一个设计选择,有利于在Scala中与Java的互操作性中使用可变参数。例如,它允许您将List转换为Scala可变参数方法,而无需在途中将其转换为Array

如果您需要使用Java的Scala可变参数,您应该创建一些scala Seq。例如,您可以编写一个Java包装来获取自动创建的数组,然后使用Predef对象中的genericWrapArray方法。

+0

那么,是的,这是有效的,但是是错误的)) – F0RR

+1

这是因为使用Java是错误的第一位;) –

+0

欲了解更多详细信息,请参阅http://stackoverflow.com/questions/10060377/how-to-use -scala-可变参数从 - Java的代码 –

-5

使用:_*您可以很容易地输入Seq的可变参数值。例如:

val b = collection.mutable.ListBuffer.empty[Int] 
b.append(List(1, 2):_*) 

所以收集API在这避免代码重复。

你也可以简单地使用appendAll

b.appendAll((List(1, 2)) 
+0

嗯,是的,我可以,但这怎么回答我的问题?)) – F0RR

+0

我刚刚修改了我的答案。 – David

+0

问题不在于Seq无法在scala中转换为可变参数。问题是我必须在Java中创建一个Seq来使用可变参数的方法。 – F0RR

14

如果您控制scala代码,您可以使用@varargs使它生成一个java兼容的varags方法,例如, @varargs def append(elems: A*): Unit = {}

相关问题