我现在有一个问题,这让我想到了一个关于 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()
。我自己的类(class)使用 <Tuple2<GenericRecord,GenericRecord>, Tuple2<GenericRecord,GenericRecord>>
作为 IN 和 OUT 参数。
现在我试图覆盖这个 flatMap()
不使用接口(interface)的功能 Collector<OUT>
但该接口(interface)的实现如下所示:
public class TupleWrappingCollector<IN, K> implements Collector<IN> {...}
据我了解,我应该能够使用此类而不是 Collector<OUT>
,因为它满足了该功能所需的接口(interface)。定义TupleWrappingCollector<Tuple2<GenericRecord,GenericRecord>, GenericRecord>
将导致实现接口(interface) Collector<Tuple2<GenericRecord,GenericRecord>>
,这正是函数 flatMap()
的作用从初始类需要,另一个参数 GenericRecord
在类(class)的某个地方,这在这里应该不重要。
但是,当我尝试像这样定义方法 header 时,出现错误:
public void flatMap(Tuple2<GenericRecord,GenericRecord> value, TupleWrappingCollector<Tuple2<GenericRecord,GenericRecord>, GenericRecord> out) {...}
没有发现被重写的方法,并且该类要求我指定 flatMap()
Tuple2<GR,GR>, Collector<Tuple2<GR,GR>>
的功能我不明白为什么。在我看来,我正在履行指定的方法 header 。
我在这里缺少什么, implements
吗?取消我用作有效参数的类的资格,还是我对接口(interface)的缩小/扩大有错误的理解?
最佳答案
履行RichFlatMapFunction::flatMap
的契约(Contract),您必须提供一个可以与 Collector<OUT>
的任何实现一起使用的函数。 .
通过将方法声明更改为 Collector<OUT>
的特定实现,您将无法将此函数应用于不是 TupleWrappingCollector<OUT, K>
子类的接口(interface)的不同实现。 .
给你举个例子:你的 RichFlatMapFunction
的实现将无法处理以下Collector
,但根据契约(Contract),应该这样做:
public class MyCollector<OUT> implements Collector<OUT> {...}
关于java - 如果需要抽象接口(interface),则不允许在函数参数中提供已实现的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60005714/