我对Java有一定的了解。我理解reserved words。我也了解匿名类的基础知识。我正在阅读this Spark示例并看到"来电"声明。 call
和@Override
的含义是什么?我看到这个电话不是一个保留字 - 但我也没有在Spark文档或import语句中看到它。有人可以分解这段代码中发生的事情吗?我得到它传递一个匿名类作为参数(对吧?) - 然后该抽象类有一个匿名方法叫做#34; call" (对?)。但被覆盖的是什么?为什么@Override
? call
指的是什么?
JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String s) {
return new Tuple2<String, Integer>(s, 1);
}
});
答案 0 :(得分:2)
您在此代码段中看到的是实现spark.api.java.function.PairFunction
的匿名类的实例化。 call
是该接口中应该实现的方法,@Override
表示该方法是在接口中定义的(而不是仅向您正在实现的方法添加另一种方法)。
注意:相同的语法适用于扩展抽象类,尽管这不是这种情况。
答案 1 :(得分:2)
PairFunction
是一个具有名为call
的单个方法的接口。这里发生的是正在创建此接口的实现并作为参数传递给words.mapToPair
。
如果你看到一个等效(但更详细)的方法来做同样的事情,可能会有点简单:
class PairFunctionImpl implements PairFunction<String, String, Integer> {
@Override
public Tuple2<String, Integer> call(String s) {
return new Tuple2<String, Integer>(s, 1);
}
}
JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunctionImpl());
您显示的代码在功能上与此相同,除了实现接口,创建实例,并将此实例作为参数传递给words.mapToPair
,这是通过匿名类在一个步骤中完成的。
@Override
注释告诉编译器检查call
方法签名是否与PairFunction
接口中的定义匹配,具有以下好处:
在这种特殊情况下,你没有从@Override
获得太多好处,因为即使没有它也会得到编译时错误(使用@Override
总是可选的),但我个人总是这样用它。
答案 2 :(得分:1)
你有几个问题
PairFunction
)一个抽象类。您刚刚实例化的类是具体的而不是抽象的。只是匿名。new
的含义:这是实现call
接口的任何类必须实现的方法的名称。它实际上做的是Spark问题,但是我从java文档中收集它会触发配对功能。PairFunction
的含义:这是一个注释,用于指示您现在定义的方法将覆盖父类中的实现。在这种情况下,您实际上并没有覆盖任何现有的实现,因为只存在一个接口,但这是约定。注释对运行时执行没有影响。我将向您推荐这个question,了解何时使用它的详细信息。