【问题标题】:convert java to scala code - change of method signatures将 java 转换为 scala 代码 - 方法签名的更改
【发布时间】:2017-04-26 05:51:10
【问题描述】:

尝试将一些 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 中的方法。

【问题讨论】:

    标签: java scala overloading raw-types


    【解决方案1】:

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

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

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

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

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

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

    但鉴于错误消息仅显示JavaPairRDD,我并不特别希望它能够工作。如果这失败了,我仍然会使用 Java 包装器。

    【讨论】:

    • 我认为原始类型在 Scala 中被解释为存在类型。
    • 呃,你是对的,当然。问题在于,在这种特定情况下,它似乎没有以这种方式解释它,因为错误消息将其显示为原始类型 (x$1: org.apache.spark.api.java.JavaPairRDD,...)。
    • 我不确定这是错误消息还是类型检查器的问题。实际上,我有一个拉取请求来改进有关原始类型的一些错误消息:github.com/scala/scala/pull/5847
    【解决方案2】:

    接受的答案是正确的说应该避免使用原始类型。然而,Scala 可以与具有原始类型的 Java 代码互操作。 Scala 将原始类型 java.util.List 解释为存在类型 java.util.List[_]

    以这段 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
    

    看来肯定有其他问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      相关资源
      最近更新 更多