Вызов Java vararg метод от Scala с примитивами

У меня есть следующий код в Java:

public class JavaClass {

    public static void method( Object x ) {
    }

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

}

Когда я пытаюсь получить доступ к нему от Scala,

object FooUser {
  JavaClass.method(true)
  JavaClass.varargsMethod(true) // <-- compile error
}

Я получаю следующую ошибку компиляции:

несоответствие типов; найденный: булевская переменная (верная) требуемый: java.lang. Объектное Примечание: типы примитивов неявно не преобразовываются в AnyRef. Можно безопасно вызвать упаковку путем кастинга x.asInstanceOf[AnyRef]

Сообщение об ошибке очень полезно и показывает, как зафиксировать ошибку, но я задавался вопросом, почему компилятор (по-видимому) рад неявно преобразовать a scala.Boolean в одном вызове метода, но не другом. Действительно ли это - ошибка или намеренный?

Обновленный для добавления: я использую Scala 2.8. Если я делаю varargsMethod подпись

public static <T> void varargsMethod(T... xs) {

вместо этого, затем ошибка также уходит. Я все еще озадачен относительно того, почему компилятор не может понять это.

9
задан Vasil Remeniuk 7 November 2010 в 16:05
поделиться

1 ответ

Варианты переменных Scala и Java - разные. Вам необходимо выполнить преобразование :

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

или ( в 2.8.0+ )

JavaClass.varargsMethod(java.util.Arrays.asList(true))
5
ответ дан 4 December 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: