gpt4 book ai didi

java - 如果需要抽象接口(interface),则不允许在函数参数中提供已实现的接口(interface)

转载 作者:行者123 更新时间:2023-12-01 18:37:36 25 4
gpt4 key购买 nike

我现在有一个问题,这让我想到了一个关于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com