如何在Java中使用Scala隐式类

Sha*_*kar 6 java scala cloudera-cdh

我有一个来自RecordService API的Scala Implicit类,我想在Java文件中使用它.

package object spark {

   implicit class RecordServiceContext(ctx: SparkContext) {
     def recordServiceTextFile(path: String) : RDD[String] = {
      new RecordServiceRDD(ctx).setPath(path)
          .map(v => v(0).asInstanceOf[Text].toString)
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

现在我尝试使用下面的导入在Java文件中导入它.

import com.cloudera.recordservice.spark.*;
Run Code Online (Sandbox Code Playgroud)

但是我无法使用来自sparkContext的recordServiceTextFile("path").

在Scala中,导入稍有不同,而且工作正常.

Łuk*_*asz 7

这是包对象中隐式类的简单定义

package object spark {
  implicit class Ext(param: Int) {
    def a = param + 1
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是如何在java中使用它

public class Test {
    public static void main(String[] args) {
        spark.package$.MODULE$.Ext(123).a();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你基本上可以RecordServiceContext用作包装你的方法,SparkContext并添加一个你可以调用的额外方法.这是隐式类的优化.

那将是这样的:

SparkContext c = ???
RDD<String> rdd = com.cloudera.recordservice.spark.package$.MODULE$.RecordServiceContext(c)
   .recordServiceTextFile("asdf");
Run Code Online (Sandbox Code Playgroud)