将java转换为scala代码-更改方法签名

将java转换为scala代码-更改方法签名,java,scala,overloading,raw-types,Java,Scala,Overloading,Raw Types,试图将一些java代码转换为scala代码时,我遇到了另一个在java世界中编译良好的方法签名的问题: 以下java代码(来自) 翻译成 这将引发以下错误: overloaded method value SaveAsFile with alternatives: [error] (x$1: java.util.List[String],x$2: String,x$3: org.datasyslab.babylon.utils.ImageType)Boolean <and> [e

试图将一些java代码转换为scala代码时,我遇到了另一个在java世界中编译良好的方法签名的问题:

以下java代码(来自)

翻译成

这将引发以下错误:

overloaded method value SaveAsFile with alternatives:
[error]   (x$1: java.util.List[String],x$2: String,x$3: org.datasyslab.babylon.utils.ImageType)Boolean <and>
[error]   (x$1: java.awt.image.BufferedImage,x$2: String,x$3: org.datasyslab.babylon.utils.ImageType)Boolean <and>
[error]   (x$1: org.apache.spark.api.java.JavaPairRDD,x$2: String,x$3: org.datasyslab.babylon.utils.ImageType)Boolean
[error]  cannot be applied to (org.apache.spark.api.java.JavaPairRDD[Integer,String], String, org.datasyslab.babylon.utils.ImageType)
[error]     sparkImageGenerator.SaveAsFile(vDistributedVector.distributedVectorImage, outputPath + "distributedVector", ImageType.SVG)
重载的方法值SaveAsFile及其替代项:
[错误](x$1:java.util.List[String],x$2:String,x$3:org.datasyslab.babylon.utils.ImageType)布尔值
[错误](x$1:java.awt.image.buffereImage,x$2:String,x$3:org.datasyslab.babylon.utils.ImageType)布尔值
[错误](x$1:org.apache.spark.api.java.javapairdd,x$2:String,x$3:org.datasyslab.babylon.utils.ImageType)布尔值
[错误]无法应用于(org.apache.spark.api.java.javapairdd[Integer,String],String,org.datasyslab.babylon.utils.ImageType)
[错误]sparkImageGenerator.SaveAsFile(VDDistributedVector.distributedVectorImage,outputPath+“distributedVector”,ImageType.SVG)

不幸的是,我真的不知道如何解决这个问题/如何在scala中正确调用该方法。

这是
ImageGenerator
中的一个问题,由
SparkImageGenerator
继承。正如你所看到的,它有一个方法

public boolean SaveAsFile(JavaPairRDD distributedImage, String outputPath, ImageType imageType)
它使用原始类型(
javapairdd
不带
)。它们的存在主要是为了与Java 5之前的代码和应用程序兼容。对于这段代码,当然没有什么好的理由,因为它实际上需要特定的类型参数。使用原始类型只会失去类型安全性。也许某些子类(当前的或潜在的)可能会覆盖它并期望不同的类型参数,但这将是对继承的滥用,必须有更好的解决方案

Scala不以任何方式支持原始类型,因此不能从中调用此方法(AFAIK)。作为一种解决方法,您可以用Java编写一个使用正确类型的包装器,并从Scala调用此包装器。我记错了,它是在扩展Java类,扩展原始类型,这是不可能的,即使这样也有解决办法

您可以通过显式类型归属来调用它(优于强制转换):


但是由于错误消息只显示了
javapairdd
,我并不特别希望它能工作。如果失败,我仍然会使用Java包装器。

这是
ImageGenerator
中的一个问题,由
SparkImageGenerator
继承。正如你所看到的,它有一个方法

public boolean SaveAsFile(JavaPairRDD distributedImage, String outputPath, ImageType imageType)
它使用原始类型(
javapairdd
不带
)。它们的存在主要是为了与Java 5之前的代码和应用程序兼容。对于这段代码,当然没有什么好的理由,因为它实际上需要特定的类型参数。使用原始类型只会失去类型安全性。也许某些子类(当前的或潜在的)可能会覆盖它并期望不同的类型参数,但这将是对继承的滥用,必须有更好的解决方案

Scala不以任何方式支持原始类型,因此不能从中调用此方法(AFAIK)。作为一种解决方法,您可以用Java编写一个使用正确类型的包装器,并从Scala调用此包装器。我记错了,它是在扩展Java类,扩展原始类型,这是不可能的,即使这样也有解决办法

您可以通过显式类型归属来调用它(优于强制转换):


但是由于错误消息只显示了
javapairdd
,我并不特别希望它能工作。如果失败,我仍然会使用Java包装器。

公认的答案是正确的,即应该避免使用原始类型。但是Scala可以与具有原始类型的Java代码进行互操作。Scala将原始类型
java.util.List
解释为存在类型
java.util.List[\u]

以以下Java代码为例:

// Test.java
import java.util.Map;

public class Test {
  public boolean foo(Map map, String s) {
    return true;
  }
}
然后尝试从Scala调用它:

Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).
Type in expressions for evaluation. Or try :help.

scala> import java.util.{Map,HashMap}
import java.util.{Map,HashMap}

scala> new Test().foo(new HashMap[String,Integer], "a")
res0: Boolean = true

scala> val h: Map[_,_] = new HashMap[String,Integer]
h: java.util.Map[_, _] = {}

scala> new Test().foo(h, "a")
res1: Boolean = true

所以看起来肯定还有其他问题。

公认的答案是正确的,即应该避免使用原始类型。但是Scala可以与具有原始类型的Java代码进行互操作。Scala将原始类型
java.util.List
解释为存在类型
java.util.List[\u]

以以下Java代码为例:

// Test.java
import java.util.Map;

public class Test {
  public boolean foo(Map map, String s) {
    return true;
  }
}
然后尝试从Scala调用它:

Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).
Type in expressions for evaluation. Or try :help.

scala> import java.util.{Map,HashMap}
import java.util.{Map,HashMap}

scala> new Test().foo(new HashMap[String,Integer], "a")
res0: Boolean = true

scala> val h: Map[_,_] = new HashMap[String,Integer]
h: java.util.Map[_, _] = {}

scala> new Test().foo(h, "a")
res1: Boolean = true

所以看起来一定还有其他问题。

我认为原始类型在Scala中被解释为存在类型。呃,你当然是对的。问题是,在这个特定的例子中,它似乎没有这样解释,因为错误消息将它显示为原始类型(
x$1:org.apache.spark.api.java.javapairdd,
)。我不确定这是错误消息还是类型检查器的问题。实际上,我有一个pull请求,它将改进一些关于原始类型的错误消息:我认为原始类型在Scala中被解释为存在类型。问题是,在这个特定的例子中,它似乎没有这样解释,因为错误消息将它显示为原始类型(
x$1:org.apache.spark.api.java.javapairdd,
)。我不确定这是错误消息还是类型检查器的问题。实际上,我有一个pull请求,它将改进一些关于原始类型的错误消息: