Dollyg:
私は2つのオーバーロードされているScalaのクラス持つset
メソッド、と1 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);
の代わりに
<S extends java.lang.Object> void set(S[]);
それは配列の共分散または何に関係している場合、私は考えています。(編集:一般的な配列オブジェクトに消去される理由スカラ:配列とタイプ消去)
編集:Scalaの3出力は、それがScalaの2改善を前方に移植されていないせいか、この時点でのJavaの下でコンパイルされません。