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

标签 java generics inheritance

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

相关文章:

java - 将多维数组传递给另一个 Activity

java - 通过 jdbc 通过准备好的语句传递 SQL 命令时出错

go - 如何允许可转换为指针的泛型类型参数化另一个可转换为指针的泛型类型?

ios - Swift 中泛型类型的工厂(协议(protocol)和泛型)

java - 为什么 Java 类型推断不适用于参数化类型的返回值?

c++ - 是否可以通过继承来实现一个接口(interface)?

c++ - 通过指向派生类的指针访问派生成员变量

java - 将值从 ArrayList 转移到另一个的最佳方式

java - TreeViewer 包无法在 ANTLR v4 w/Java 中工作

java - 使用策略模式避免向下转型