Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Java互操作,方法重载问题(数组和varargs)_Java_Scala_Overloading_Variadic Functions_Scala Java Interop - Fatal编程技术网

Scala Java互操作,方法重载问题(数组和varargs)

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](

我有一个Scala类,它有两个重载的
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重载解析的工作方式不同。这让每个人都感到困惑。