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

标签 java scala overloading raw-types

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

以下java代码(来自https://github.com/DataSystemsLab/GeoSpark/blob/master/babylon/src/main/java/org/datasyslab/babylon/showcase/Example.java#L122-L126)

visualizationOperator = new ScatterPlot(1000,600,USMainLandBoundary,false,-1,-1,true,true);
visualizationOperator.CustomizeColor(255, 255, 255, 255, Color.GREEN, true);
visualizationOperator.Visualize(sparkContext, spatialRDD);
imageGenerator = new SparkImageGenerator();
imageGenerator.SaveAsFile(visualizationOperator.distributedVectorImage, "file://"+outputPath,ImageType.SVG);

翻译为https://github.com/geoHeil/geoSparkScalaSample/blob/master/src/main/scala/myOrg/visualization/Vis.scala#L45-L57

val vDistributedVector = new ScatterPlot(1000, 600, USMainLandBoundary, false, -1, -1, true, true)
vDistributedVector.CustomizeColor(255, 255, 255, 255, Color.GREEN, true)
vDistributedVector.Visualize(s, spatialRDD)
sparkImageGenerator.SaveAsFile(vDistributedVector.distributedVectorImage, outputPath + "distributedVector", ImageType.SVG)

这将引发以下错误:

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)

不幸的是,我不太确定如何解决这个问题/如何正确调用 scala 中的方法。

最佳答案

这是 ImageGenerator 中的问题,继承自SparkImageGenerator 。如您所见here ,它有一个方法

public boolean SaveAsFile(JavaPairRDD distributedImage, String outputPath, ImageType imageType)

使用原始类型( JavaPairRDD 不带 <...> )。它们的存在主要是为了与 Java 5 之前的代码和 shouldn't normally be used otherwise 兼容。 。对于这段代码,当然没有充分的理由,因为它实际上需要特定的类型参数。使用原始类型只会失去类型安全性。也许某些子类(当前或潜在的)可能会覆盖它并期望不同的类型参数,但这将是继承的滥用,必须有更好的解决方案。

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

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

sparkImageGenerator.SaveAsFile(
  (vDistributedVector.distributedVectorImage: JavaPairRDD[_, _]), 
  outputPath + "distributedVector", ImageType.SVG)

但是给出的错误消息仅显示 JavaPairRDD ,我并不特别期望它能起作用。如果失败,我仍然会使用 Java 包装器。

关于java - 将 java 转换为 scala 代码 - 更改方法签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43626048/

相关文章:

java - Spring Rest数据模型序列化

scala - 如何在 Scala 中编写自定义线性集合

c++ - 列表初始化中多个模板化构造函数的重载规则

java - Apache HTTP BasicScheme.authenticate 已弃用?

java - 注释处理器不能在纯 Java 中运行

scala - 如何检查 Any 值是否为空?

regex - 删除多行字符串中的特殊字符 Scala

具有方法重写的 C++ 继承

c++ - 如何通过类型和非类型模板参数重载模板类?

java - 多维数组的新手