具有不同签名的覆盖方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有不同签名的覆盖方法相关的知识,希望对你有一定的参考价值。

我有一个超类使用该方法:

protected <E extends Enum<E>,T extends VO> void processarRelatorioComEstado(Date dataInicial, Date dataFinal, E estado) throws RelatorioException {

    throw new UnsupportedOperationException("method not overridden");
}

在其中一个子类中,我想要执行以下操作:

    @Override
protected <E extends Enum<E>> DemonstrativoReceitaDespesasAnexo12Vo processarRelatorioComEstado(Date dataInicial, Date dataFinal, E estado) throws RelatorioException {
//do something
return DemonstrativoReceitaDespesasAnexo12Vo;
}

但这只是行不通。问题是我有一个超类的引用,我想调用这个方法,但只在一个子类中。

答案

您无法更改重写方法中的类型参数数。至于你的情况,覆盖明显失败,返回类型。但即使返回类型相同,您的方法仍然不会覆盖等效,因为您在所谓的重写方法中具有较少的类型参数。

来自JLS - Method Signature

如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。

如果满足以下所有条件,则两个方法或构造函数声明M和N具有相同的参数类型:

  • 它们具有相同数量的形式参数(可能为零)
  • 它们具有相同数量的类型参数(可能为零)

因此,即使以下代码也会失败:

interface Demo {
    public <S, T> void show();
}

class DemoImpl implements Demo {
    @Override
    public <T> void show() { }  // Compiler error
}

由于类型参数较少,因此类中的方法show()不会与接口中的方法等效。

因此,您应该确保方法签名与JLS部分中指定的完全相同(相同名称,相同数量和类型的参数(包括类型参数),共变量返回类型)。

另一答案

根据java overridding

重写方法具有相同的名称,参数的数量和类型,并返回类型作为它重写的方法。重写方法还可以返回由重写方法返回的类型的子类型。这称为协变返回类型。

这里你的方法返回类型是不同的,所以它不会覆盖。

另一答案

阅读上面的评论,我理解这种方法不起作用,所以我在代码中进行了一些更改,并像魅力一样工作,遵循以下代码:

超类:

protected VO processarRelatorioComEstado(Date dataInicial, Date dataFinal, Enum<?> estado) throws RelatorioException {

    throw new UnsupportedOperationException("method not overridden");
}

和子类:

public VO processarRelatorioComEstado(Date dataInicial, Date dataFinal, Enum<?> estado) throws RelatorioException {
//do something
return VOsubtype;

}

多谢你们。

以上是关于具有不同签名的覆盖方法的主要内容,如果未能解决你的问题,请参考以下文章

java的重写重载覆盖的差别

您可以使用不同但“兼容”的签名覆盖接口方法吗?

区分函数重载和函数覆盖

Python方法覆盖,签名重要吗?

如何创建具有可变参数/不同方法签名的方法接口?

四. Java继承和多态3. 继承中的方法的覆盖和重载