【发布时间】:2020-01-31 14:21:48
【问题描述】:
我现在有一个问题,这让我想到了一个关于 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 参数。
现在我尝试使用该接口的实现而不是接口Collector<OUT> 来覆盖这个flatMap() 函数,如下所示:
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) {...}
没有发现方法被覆盖,并且该类要求我为Tuple2<GR,GR>, Collector<Tuple2<GR,GR>> 指定一个flatMap() 函数,我不明白为什么。在我看来,我正在履行指定的方法头。
我在这里遗漏了什么,implements 是否取消了我作为有效参数使用的类的资格,还是我对接口的缩小/扩大有错误的把握?
【问题讨论】:
-
我现在才意识到,它不是一个专门的接口,而是一个实现/实现的接口
标签: java generics inheritance