使用原语从Scala调用Java vararg方法

Mat*_*t R 9 java interop scala variadic-functions primitive-types

我在Java中有以下代码:

public class JavaClass {

    public static void method( Object x ) {
    }

    public static void varargsMethod( Object... x ) {
    }

}
Run Code Online (Sandbox Code Playgroud)

当我尝试从Scala访问它时,

object FooUser {
  JavaClass.method(true)
  JavaClass.varargsMethod(true) // <-- compile error
}
Run Code Online (Sandbox Code Playgroud)

我得到以下编译错误:

类型不匹配; found:Boolean(true)required:java.lang.Object注意:基本类型不会隐式转换为AnyRef.你可以通过施放x.asInstanceOf [AnyRef]来安全地强制拳击

错误消息是非常有用的,并显示如何修复错误,但我想知道为什么编译器(显然)很乐意隐式转换scala.Boolean一个方法调用而不是另一个.这是一个错误还是故意的?

更新以添加: 我正在使用Scala 2.8.如果我制作varargsMethod签名

public static <T> void varargsMethod(T... xs) {
Run Code Online (Sandbox Code Playgroud)

相反,那么错误也会消失.我仍然感到困惑,为什么编译器无法搞清楚.

Vas*_*iuk 5

Scala varargs和Java varargs是不同的.您需要进行转换:

def g(x: Any*) = x.asInstanceOf[scala.runtime.BoxedObjectArray]
.unbox(x.getClass)
.asInstanceOf[Array[Object]]  
...
JavaClass.varargsMethod(g(true))
Run Code Online (Sandbox Code Playgroud)

或(2.8.0+以上)

JavaClass.varargsMethod(java.util.Arrays.asList(true))
Run Code Online (Sandbox Code Playgroud)

  • 2.8"Arrays.asList(true)"版本不起作用,因为它为"Arrays $ ArrayList"类型的"varargsMethod"提供单个参数.但是,找到一个解决方法并不是一个真正的问题 - 错误消息显示了如何修复错误 - 而是我想知道为什么编译器不会编译此调用时它将在其他类似情况下编译. (3认同)