Scala-Java 互操作,方法重载问题(数组和可变参数)
Scala-Java interop, issue with overloading of methods (Array and varargs)
我有一个 Scala class,它有两个重载的 set
方法,
一个带有 Array
参数,另一个带有 varargs
。
我想从 Java 端调用这些方法,由于重载 and/or boxing/unboxing,我面临一些问题。如果有人可以解释我面临的问题背后的原因,那将会很有帮助and/or 建议解决方法。
Scala class
class Sample {
def set[S](values: Array[S]): Unit = {
println("Array overload")
}
@varargs
def set[S](value: S, values: S*): Unit = {
println("Varargs overload")
}
}
来自 Java
的电话
public static void main(String[] args) {
Sample sample = new Sample();
Boolean[] array = {true, false};
Boolean boxed = true;
boolean primitive = true;
// works for array
sample.set(array); // should call Array-overload, calls Array-overload
// doesn't work for single element varargs
sample.set(boxed); // should call varargs-overload, calls Array-overload instead
sample.set(primitive); // should call varargs-overload, calls Array-overload instead
// works for multiple varargs
sample.set(boxed, boxed); // should call varargs-overload, varargs-overload is called
sample.set(primitive, primitive); // should call varargs-overload, varargs-overload is called
}
我想这是因为 Scala 的结果是
public <S extends java.lang.Object> void set(java.lang.Object);
而不是
<S extends java.lang.Object> void set(S[]);
我不知道这是否与数组的协方差有关。 (编辑:为什么通用数组被擦除为对象:Scala: arrays and type erasure)
编辑:Scala 3 输出目前无法在 Java 下编译,可能是因为它没有向前移植 Scala 2 的改进。
我有一个 Scala class,它有两个重载的 set
方法,
一个带有 Array
参数,另一个带有 varargs
。
我想从 Java 端调用这些方法,由于重载 and/or boxing/unboxing,我面临一些问题。如果有人可以解释我面临的问题背后的原因,那将会很有帮助and/or 建议解决方法。
Scala class
class Sample {
def set[S](values: Array[S]): Unit = {
println("Array overload")
}
@varargs
def set[S](value: S, values: S*): Unit = {
println("Varargs overload")
}
}
来自 Java
的电话 public static void main(String[] args) {
Sample sample = new Sample();
Boolean[] array = {true, false};
Boolean boxed = true;
boolean primitive = true;
// works for array
sample.set(array); // should call Array-overload, calls Array-overload
// doesn't work for single element varargs
sample.set(boxed); // should call varargs-overload, calls Array-overload instead
sample.set(primitive); // should call varargs-overload, calls Array-overload instead
// works for multiple varargs
sample.set(boxed, boxed); // should call varargs-overload, varargs-overload is called
sample.set(primitive, primitive); // should call varargs-overload, varargs-overload is called
}
我想这是因为 Scala 的结果是
public <S extends java.lang.Object> void set(java.lang.Object);
而不是
<S extends java.lang.Object> void set(S[]);
我不知道这是否与数组的协方差有关。 (编辑:为什么通用数组被擦除为对象:Scala: arrays and type erasure)
编辑:Scala 3 输出目前无法在 Java 下编译,可能是因为它没有向前移植 Scala 2 的改进。