【问题标题】:In Java, how to let child class decide of which type parameter class use as overridden method argument?在Java中,如何让子类决定使用哪个类型参数类作为被覆盖的方法参数?
【发布时间】:2019-12-14 14:01:29
【问题描述】:

我有一个抽象类,我希望在其中有一个抽象方法接受消费者函数接口的参数,并让子类决定哪种类型应该参数化消费者。

我是这样试过的:

public void show(Consumer<?> validationHandler) {
    this.validationHandler = validationHandler;
    stage.show();
}

但在子类中,它说它不是正确的覆盖:

@Override
public void show(Consumer<Protection> validationHandler) {
    super.show(validationHandler);
}

我的目标是能够在子实例上调用此方法,并在我将传递的消费者 lambda 中提供正确的类型。

你知道如何进行吗?

【问题讨论】:

  • 您是否在基类中尝试过Consumer&lt;? extends ProtectionBase&gt;? (ProtectionBase 是保护类的基类)
  • 你能告诉我们消费者是关于什么的吗?

标签: java generics inheritance overriding functional-interface


【解决方案1】:

使您的基类泛型(具有泛型类型 T),并使 show() 接受 Consumer&lt;T&gt;(或 Consumer&lt;? super T&gt;。使子类扩展 BaseClass&lt;Protection&gt;

class BaseClass<T> {
    public void show(Consumer<T> validationHandler) { //  or Consumer<? super T>
    }
}

class SubClass extends BaseClass<Protection> {
    @Override
    public void show(Consumer<Protection> validationHandler) { //  or Consumer<? super Protection>
        super.show(validationHandler);
    }
}

class Protection {}

【讨论】:

  • 我想知道为什么Consumer&lt;? super T&gt;,我猜Consumer&lt;? extends T&gt; 也可能有用...我真的很想知道“消费者”抽象是什么...我想问题的作者可能稍微解释一下它的目的......
  • @Victor docs.oracle.com/javase/8/docs/api/java/util/function/…, stackoverflow.com/questions/2723397/…。消费者 extends T> 没用。你对这样的消费者无能为力。
  • 我认为这是一种自定义抽象,而不是你指向@JB Nizet 的那个......基于你的假设?也许我在这里遗漏了一些常见的“隐式”词汇
  • Java库中有一个标准的Consumer功能接口。因此,当 OP 谈到使用 Consumer 功能接口时,可以安全地假设它是标准接口。即使不是,消费者也是消费的东西,所以它是相似的。
  • okey... 可能因为我不习惯使用这些术语.. 对我来说是这样的:如果您将使用层次结构以下的对象,则使用 super,如果您要工作与您使用的层次结构之上的对象扩展..我将重新阅读有关消费者和生产者的更多信息,我猜我当时忘记了..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多