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)
相反,那么错误也会消失.我仍然感到困惑,为什么编译器无法搞清楚.
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)
归档时间: |
|
查看次数: |
3177 次 |
最近记录: |