Scalaの-Javaの相互運用機能、方法(配列および可変引数)の過負荷の問題

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の下でコンパイルされません。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=5069&siteId=1