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 的改进。