小编典典

具有不同签名的替代方法

java

我有一个超类的方法:

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;
}

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


阅读 219

收藏
2020-11-23

共1个答案

小编典典

您不能在重写方法中更改类型参数的数量。对于您的情况,返回类型显然会覆盖失败。但是,即使返回类型相同,您的方法仍然不会被覆盖等效,因为您应该覆盖的方法中的类型参数更少。

JLS-
方法签名

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

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

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

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

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

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

由于show()类型参数较少,因此类中的方法没有覆盖接口中的方法。

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

2020-11-23