什么"呼叫"意思是在这个java代码中

时间:2015-01-26 21:19:11

标签: java anonymous-class

我对Java有一定的了解。我理解reserved words。我也了解匿名类的基础知识。我正在阅读this Spark示例并看到"来电"声明。 call@Override的含义是什么?我看到这个电话不是一个保留字 - 但我也没有在Spark文档或import语句中看到它。有人可以分解这段代码中发生的事情吗?我得到它传递一个匿名类作为参数(对吧?) - 然后该抽象类有一个匿名方法叫做#34; call" (对?)。但被覆盖的是什么?为什么@Overridecall指的是什么?

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);
  }
});

3 个答案:

答案 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)

你有几个问题

  1. “我知道它传递了一个匿名类作为参数(对吗?)”不完全,没有传递匿名类,传递的是上面定义的匿名类的实例,它实现了{{1}接口。您稍后将此对象称为抽象类,它也不是抽象类。你不能构造(调用PairFunction)一个抽象类。您刚刚实例化的类是具体的而不是抽象的。只是匿名。
  2. new的含义:这是实现call接口的任何类必须实现的方法的名称。它实际上做的是Spark问题,但是我从java文档中收集它会触发配对功能。
  3. PairFunction的含义:这是一个注释,用于指示您现在定义的方法将覆盖父类中的实现。在这种情况下,您实际上并没有覆盖任何现有的实现,因为只存在一个接口,但这是约定。注释对运行时执行没有影响。我将向您推荐这个question,了解何时使用它的详细信息。