【问题标题】:Providing an implemented interface in function parameter not allowed, if abstract interface is expected如果需要抽象接口,则不允许在函数参数中提供已实现的接口
【发布时间】: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()。我自己的班级使用&lt;Tuple2&lt;GenericRecord,GenericRecord&gt;, Tuple2&lt;GenericRecord,GenericRecord&gt;&gt; 作为 IN 和 OUT 参数。

现在我尝试使用该接口的实现而不是接口Collector&lt;OUT&gt; 来覆盖这个flatMap() 函数,如下所示:

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

据我了解,我应该可以使用这个类而不是Collector&lt;OUT&gt;,因为它实现了函数所需的这个接口。定义TupleWrappingCollector&lt;Tuple2&lt;GenericRecord,GenericRecord&gt;, GenericRecord&gt; 将导致使用Collector&lt;Tuple2&lt;GenericRecord,GenericRecord&gt;&gt; 实现接口,这正是初始类中的函数flatMap() 所需要的,以及类中某处的另一个参数GenericRecord,在这里应该无关紧要。 但是,当我尝试像这样定义方法标头时显示错误:

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

没有发现方法被覆盖,并且该类要求我为Tuple2&lt;GR,GR&gt;, Collector&lt;Tuple2&lt;GR,GR&gt;&gt; 指定一个flatMap() 函数,我不明白为什么。在我看来,我正在履行指定的方法头。

我在这里遗漏了什么,implements 是否取消了我作为有效参数使用的类的资格,还是我对接口的缩小/扩大有错误的把握?

【问题讨论】:

  • 我现在才意识到,它不是一个专门的接口,而是一个实现/实现的接口

标签: java generics inheritance


【解决方案1】:

要履行RichFlatMapFunction::flatMap 的合约,您必须提供一个可以与Collector&lt;OUT&gt;任何 实现一起使用的函数。

通过将方法声明更改为Collector&lt;OUT&gt; 的特定实现,您将无法将此函数应用于不是TupleWrappingCollector&lt;OUT, K&gt; 子类的接口的不同实现。

举个例子:您的RichFlatMapFunction 实现将无法处理以下Collector,但根据合同它应该这样做:

public class MyCollector<OUT> implements Collector<OUT> {...}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多