У меня есть следующий код в 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) {
вместо этого, затем ошибка также уходит. Я все еще озадачен относительно того, почему компилятор не может понять это.
Варианты переменных 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))