假设我有一个如下所示的 Java API:
public class JavaApi<T> {
public void foo(T[] data) {
...
}
}
我想使用以下类从 Scala 调用它:
class Caller[T] {
val javaApi = new JavaApi[T]()
def callApi(data: Array[T]) = javaApi.foo(data)
}
编译时,我得到以下信息:
type mismatch;
found : Array[T]
required: Array[T with Object]
Note: T >: T with Object, but class Array is invariant in type T.
You may with to investigate a wildcard type such as `_ >: T with Object`. (SLS 3.2.10)
def callApi(data: Array[T]) = javaApi.foo(data)
最佳答案
您可以查看Scala type hierarchy 。更具体地说,这句话是:
If Scala is used in the context of a Java runtime environment, then scala.AnyRef corresponds to java.lang.Object
因此,通过按照 Jubobs 的建议进行更改,您可以确定该类型对应于一个对象:
class Caller[T<: AnyRef] {
val javaApi = new JavaApi[T]()
def callApi(data: Array[T]) = javaApi.foo(data)
}
因此,如果您需要任何值类型(如 int、char、boolean),您需要将它们转换为对象等效的装箱 Java 类型(如 Integer、Character 或 Boolean)。看:
关于java - Scala 使用数组参数调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41997332/