什么是;调用;在这个java代码中是什么意思

什么是;调用;在这个java代码中是什么意思,java,anonymous-class,Java,Anonymous Class,我对Java有实际的了解。我理解。我还了解匿名类的基本知识。我正在阅读Spark示例,看到一个“call”语句。调用和@覆盖的含义是什么?我看到调用不是保留字,但在Spark文档或import语句中也没有看到。有人能分析一下这段代码中发生了什么吗?我知道它将一个匿名类作为参数传递(对吗?),然后这个抽象类有一个名为“call”的匿名方法(对吗?)。但是什么被覆盖了呢?为什么@会覆盖?调用指的是什么 JavaPairRDD<String, Integer> ones = words.m

我对Java有实际的了解。我理解。我还了解匿名类的基本知识。我正在阅读Spark示例,看到一个“call”语句。
调用
@覆盖
的含义是什么?我看到调用不是保留字,但在Spark文档或import语句中也没有看到。有人能分析一下这段代码中发生了什么吗?我知道它将一个匿名类作为参数传递(对吗?),然后这个抽象类有一个名为“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);
  }
});
javapairdd ones=words.mapToPair(新PairFunction(){
@凌驾
公共元组2调用(字符串s){
返回新的Tuple2(s,1);
}
});

在这段代码中,您看到的是实现的匿名类的实例化
call
是该接口中应该实现的方法,
@Override
表示该方法在接口中定义(而不是仅向正在实现的方法添加另一个方法)


注意:对于扩展抽象类,同样的语法也适用,尽管这里不是这样。

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());
类PairFunctionImpl实现PairFunction{
@凌驾
公共元组2调用(字符串s){
返回新的Tuple2(s,1);
}
}
javapairdd ones=words.mapToPair(新PairFunctionImpl());
您显示的代码在功能上与此相同,除了实现接口、创建实例并将此实例作为参数传递给
words。mapToPair
通过匿名类在一个步骤中完成

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

  • 提供防止打字错误的保护措施
  • 通过使类中的哪些方法是在实现的接口或扩展类中定义的,从而提高代码可读性

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

您有几个问题

  • “我知道它将匿名类作为参数传递(对吗?)”不完全是,匿名类没有被传递,传递的是上面定义的匿名类的一个实例,它实现了
    PairFunction
    接口。稍后您将该对象称为抽象类,它也不是抽象类。不能构造(调用
    new
    on)抽象类。您刚才实例化的类是具体的,而不是抽象的。只是匿名而已
  • call
    :这是任何实现
    PairFunction
    接口的类都必须实现的方法的名称。它的实际作用是一个火花问题,但我从java文档中收集到它触发了配对函数
  • @Override
    :这是一个注释,用于指示您现在定义的方法覆盖父类中的实现。在这种情况下,您实际上并没有覆盖任何现有的实现,因为只有一个接口存在,但这是约定。注释对运行时执行没有影响。关于何时使用它的更多细节,我将向您介绍

  • 这是一个函数名。查看
    PairFunction
    接口并了解匿名内部类同样,
    PairFunction
    是一个接口而不是抽象类@Dónal不知道我在看什么,但你是对的。据此编辑。谢谢