Scala Java互操作,方法重载问题(数组和varargs)
我有一个Scala类,它有两个重载的Scala Java互操作,方法重载问题(数组和varargs),java,scala,overloading,variadic-functions,scala-java-interop,Java,Scala,Overloading,Variadic Functions,Scala Java Interop,我有一个Scala类,它有两个重载的set方法, 一个带有Arrayparam,另一个带有varargs。 我想从Java端调用这些方法,由于重载和/或装箱/拆箱,我面临一些问题。如果有人能解释我面临的问题背后的原因和/或建议解决办法,这将是很有帮助的 Scala类 class Sample { def set[S](values: Array[S]): Unit = { println("Array overload") } @varargs def set[S](
set
方法,
一个带有Array
param,另一个带有varargs
。
我想从Java端调用这些方法,由于重载和/或装箱/拆箱,我面临一些问题。如果有人能解释我面临的问题背后的原因和/或建议解决办法,这将是很有帮助的
Scala类
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);
公共空集(java.lang.Object);
而不是
<S extends java.lang.Object> void set(S[]);
void set(S[]);
我不知道这是否与阵列的协方差有关。(编辑:将常规数组擦除为对象的原因:)
编辑:Scala 3输出目前没有在Java下编译,可能是因为它没有转发Scala 2的改进。谢谢,我忘了在示例中添加它,这将得到纠正。但问题仍然存在,当使用单个元素调用方法时,不会调用varargs重载。Java和Scala重载解析的工作方式不同。这让每个人都感到困惑。