Scala - Java взаимодействие, проблема с перегрузкой методов (Array и varargs) - PullRequest
3 голосов
/ 12 февраля 2020

У меня есть класс Scala, который имеет два перегруженных метода set, один с параметром Array, а другой с varargs. Я хочу вызвать эти методы со стороны Java, я столкнулся с некоторыми проблемами из-за перегрузки и / или упаковки / распаковки. Было бы полезно, если бы кто-то смог объяснить причину проблемы, с которой я столкнулся, и / или предложить обходные пути.

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


    }

1 Ответ

3 голосов
/ 12 февраля 2020

Я думаю, это потому, что Scala приводит к

public <S extends java.lang.Object> void set(java.lang.Object);

вместо

<S extends java.lang.Object> void set(S[]);

Я понятия не имею, имеет ли это отношение к ковариации массивов или как. (Изменить: почему массив c стирается в объект: Scala: массивы и стирание типов )

Редактировать: Scala 3 вывод не компилируется в Java в настоящее время, вероятно, потому что в нем нет улучшений Scala 2, перенесенных вперед.

...