【问题标题】:Override method with different signature具有不同签名的覆盖方法
【发布时间】:2018-09-07 02:42:48
【问题描述】:

我有一个超类的方法:

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

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

【问题讨论】:

  • 如果签名不同,则不会覆盖。

标签: java generics polymorphism


【解决方案1】:

根据javaoverridding

覆盖方法与它覆盖的方法具有相同的名称、参数数量和类型以及返回类型。覆盖方法还可以返回被覆盖方法返回的类型的子类型。这称为协变返回类型。

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

【讨论】:

  • 好的,如果我在 T 扩展 vo 后将方法更改为返回 T,然后我可以在这种情况下返回 vo 的实现 DemonstrativoReceitaDespesasAnexo12Vo?
  • @danillosl 您还需要将超类方法的返回类型从void 更改为DemonstrativoReceitaDespesasAnexo12Vo
【解决方案2】:

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

来自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 部分中指定的完全相同(相同名称、相同数量和类型的参数(包括类型参数)、协变返回类型)。

【讨论】:

    【解决方案3】:

    阅读了上面的 cmets,我知道这种方法行不通,所以我对代码进行了一些更改,并像魅力一样工作,遵循代码:

    超类:

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

    谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 2020-02-28
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多