2015-01-26 4 views
2

У меня есть рабочее понимание Java. Я понимаю reserved words. Я также понимаю основы анонимных классов. Я читаю пример this Spark и вижу инструкцию «вызов». В чем смысл call и @Override? Я вижу, что вызов не является зарезервированным словом, но я также не вижу его в документах Spark или в инструкции import. Может ли кто-то сломать то, что происходит в этом коде? Я понимаю, что он передает анонимный класс в качестве параметра (правильно?) - и тогда этот абстрактный класс имеет анонимный метод, называемый «вызов» (справа?). Но что переписывается? Почему @Override? Что такое call?Что означает «вызов» в этом Java-коде

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

Это название функции. Посмотрите на интерфейс 'PairFunction' и узнайте об анонимных внутренних классах. – SLaks

+0

Также http://docs.oracle.com/javase/7/docs/api/java/lang/Override.html –

ответ

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, который имеет следующие преимущества:

  • обеспечивает защиту от опечаток
  • Усиливает читаемость кода путем более ясно, какие методы в классе определены в реализованном интерфейсе или расширенном классе

В этом конкретном случае вы не g много пользы от @Override, потому что вы получите ошибку времени компиляции даже без него (использование @Override всегда необязательно), но лично я всегда использую его.

2

То, что вы видите в этом фрагменте является конкретизацией анонимного класса, который реализует spark.api.java.function.PairFunction. call - это метод в этом интерфейсе, который должен быть реализован, а @Override означает, что этот метод определен в интерфейсе (в отличие от простого добавления другого метода к тому, который вы реализуете).

Примечание: этот синтаксис имеет место для расширения абстрактного класса, хотя здесь это не так.

+1

' PairFunction' - это интерфейс, а не абстрактный класс https://spark.apache.org/docs/1.1.0/api/java/org/apache/spark/api/java/function/PairFunction.html –

+0

@ Dónal не знает, что я смотрел , но вы правы. Отредактировано соответственно. Благодаря! – Mureinik

+0

добро пожаловать! –

1

У вас есть несколько вопросов

  1. «Я понимаю, что он передает анонимный класс в качестве параметра (правильно?)» Не совсем, анонимный класс не передается, то, что передается является экземпляром анонимный класс, определенный выше, который реализует интерфейс PairFunction. Вы позже ссылаетесь на этот объект как абстрактный класс, он также не является абстрактным. Вы не можете построить (вызовите new) абстрактный класс. Класс, который вы только что создали, является конкретным, а не абстрактным. Просто анонимный.
  2. Значение call: Это имя метода, который должен реализовать любой класс, реализующий интерфейс PairFunction.Фактически это вопрос Spark, но из java-документов я собираю, что он вызывает функцию спаривания.
  3. Значение @Override: Это аннотация, которая используется для обозначения того, что метод, который вы сейчас определяете, переопределяет реализацию в родительском классе. В этом случае вы фактически не переопределяете какую-либо существующую реализацию, поскольку существует только интерфейс, но это соглашение. Аннотация не влияет на выполнение во время выполнения. Я расскажу вам об этом question для получения более подробной информации о том, когда его использовать.
Смежные вопросы