"call" 在此 java 代码中是什么意思

What does "call" mean in this java code

我对 Java 有一定的了解。我了解 reserved words. I also understand the basics of anonymous classes. I am reading this Spark 示例并看到 "call" 语句。 call@Override 是什么意思?我看到 call 不是保留字——但我也没有在 Spark 文档或 import 语句中看到它。有人可以分解这段代码中发生的事情吗?我知道它传递一个匿名 class 作为参数(对吗?)——然后那个抽象 class 有一个名为 "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);
  }
});

您在此代码段中看到的是实现 spark.api.java.function.PairFunction 的匿名 class 的实例化。 call 是该接口中应该实现的方法,@Override 表示该方法是在接口中定义的(而不是仅向您正在实现的方法添加另一个方法)。

注意:相同的语法适用于扩展抽象 class,尽管这里不是这种情况。

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 之外,您显示的代码在功能上与此相同,这些都是通过匿名 class.

@Override注解告诉编译器检查call方法签名是否与PairFunction接口中的定义匹配,这样有以下好处:

  • 防止拼写错误
  • 通过更清楚地说明 class 中的哪些方法是在已实现的接口中定义的或扩展的 class
  • 来增强代码的可读性

在这种特殊情况下,您不会从 @Override 中获得太多好处,因为即使没有它您也会遇到编译时错误(使用 @Override 始终是可选的),但就个人而言我一直用它。

你有几个问题

  1. "I get that it passes an anonymous class as a parameter (right?)" 不完全是,传递的不是匿名class,传递的是上面定义的实现了PairFunction接口的匿名class实例.您稍后将此对象称为抽象 class,它也不是抽象的。您不能构造(调用 new)抽象 class。您刚刚实例化的 class 是具体的而不是抽象的。只是匿名。
  2. call的含义:这是实现PairFunction接口的任何class必须实现的方法名。它实际上做的是一个 Spark 问题,但我从 java 文档中了解到它触发了配对功能。
  3. @Override的含义:这是一个注释,用于指示您现在定义的方法覆盖了父class中的实现。在这种情况下,您实际上并没有覆盖任何现有的实现,因为只存在一个接口,但这是惯例。该注释对 运行 时间执行没有影响。我会推荐你​​参考这个 question 以了解有关何时使用它的更多详细信息。