Scala:重载Java方法出错

时间:2015-10-29 11:19:14

标签: java scala

我正在尝试在Scala中使用库dcm4che3

我的Scala代码是

val item: Attributes = new Attributes
val x: Int = ints.toArray.length
val vr: VR = VR.OW
val intArray: Array[Int] = ints.toArray
item.setInt(Tag.LUTData, vr, intArray)

我收到错误

Error:(125, 10) overloaded method value setInt with alternatives:
  (x$1: String,x$2: Int,x$3: org.dcm4che3.data.VR,x$4: Int*)Object <and>
  (x$1: Int,x$2: org.dcm4che3.data.VR,x$3: Int*)Object
 cannot be applied to (Int, org.dcm4che3.data.VR, Array[Int])
    item.setInt(Tag.LUTData, vr, intArray)

我在错误中注意到它要求Int *。 java签名是

setInt(int,org.dcm4che3.data.VR,int[])

我理解Array [Int]是int []的scala等价物。什么是Int *?为什么这不起作用?

1 个答案:

答案 0 :(得分:3)

Int*是一个varargs参数,相当于Java int...。就像Java一样,你可以传递数组或任意数量的参数,但是为了避免在传递null时你在Java中产生的歧义,Scala中有一个特殊的语法。按如下方式调用该函数: -

item.setInt(Tag.LUTData, vr, intArray:_*)

实际上,您可能根本不需要数组:您可以将任何序列传递给Scala中的varargs函数,而不仅仅是数组,因此如果ints变量是某种序列,您可以将其传递到intArray,并完全删除intArray

另请参阅What does `:_*` (colon underscore star) do in Scala?,这与您的问题相反。