Предоставление реализованного интерфейса в параметре функции не допускается, если ожидается абстрактный интерфейс - PullRequest
0 голосов
/ 31 января 2020

У меня сейчас есть проблема, которая привела меня к более общему вопросу, касающемуся Java и его механизмов наследования.

Существует абстрактный класс, который мне нужно расширить, который выглядит следующим образом:

public abstract class RichFlatMapFunction<IN, OUT> extends AbstractRichFunction implements FlatMapFunction<IN, OUT> {

    private static final long serialVersionUID = 1L;

    @Override
    public abstract void flatMap(IN value, Collector<OUT> out) throws Exception;
}

Следовательно, в моей реализации я хочу (нужно) переопределить функцию flatMap(). Мой собственный класс использует <Tuple2<GenericRecord,GenericRecord>, Tuple2<GenericRecord,GenericRecord>> в качестве параметров IN и OUT.

Теперь я пытаюсь переопределить эту flatMap() функцию, используя не интерфейс Collector<OUT>, а реализацию этого интерфейса, которая выглядит следующим образом:

public class TupleWrappingCollector<IN, K> implements Collector<IN> {...}

Насколько я понимаю, я должен иметь возможность использовать этот класс вместо Collector<OUT>, так как он выполняет этот интерфейс, требуемый функцией. Определение TupleWrappingCollector<Tuple2<GenericRecord,GenericRecord>, GenericRecord> приведет к реализации интерфейса с Collector<Tuple2<GenericRecord,GenericRecord>>, что именно то, что требуется для функции flatMap() из исходного класса, и другого параметра GenericRecord где-то в классе, что здесь не должно иметь значения. Тем не менее, при попытке определить заголовок метода я вижу ошибку следующим образом:

public void flatMap(Tuple2<GenericRecord,GenericRecord> value, TupleWrappingCollector<Tuple2<GenericRecord,GenericRecord>, GenericRecord> out) {...}

Не найдено метода, который можно переопределить, и класс требует, чтобы я указал flatMap() функцию для Tuple2<GR,GR>, Collector<Tuple2<GR,GR>> и я не понимаю почему. По моему мнению, я выполняю указанный заголовок метода.

Чего мне здесь не хватает, implements дисквалифицирует класс, который я использую в качестве допустимого параметра, или у меня неправильный gr asp по сужению / расширению для интерфейсов?

1 Ответ

0 голосов
/ 31 января 2020

Чтобы выполнить контракт на RichFlatMapFunction::flatMap, вам нужно будет предоставить функцию, которая может работать с любой реализацией Collector<OUT>.

, изменив объявление метода на Определив c реализацию Collector<OUT>, вы не сможете применить эту функцию к другой реализации интерфейса, которая не является подклассом TupleWrappingCollector<OUT, K>.

. Вот вам пример: реализация RichFlatMapFunction не сможет обработать следующее Collector, но согласно контракту это должно быть сделано:

public class MyCollector<OUT> implements Collector<OUT> {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...