我有一个超类使用方法:
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;
}
但这不起作用。问题是我有一个超类的引用,我想调用这个方法,但只在一个子类中。
答案 0 :(得分:6)
根据java overridding
重写方法具有相同的名称,参数的数量和类型,并且返回类型与它重写的方法相同。重写方法还可以返回由重写方法返回的类型的子类型。这称为协变返回类型。
此处您的方法返回类型不同,因此不会覆盖。
答案 1 :(得分:4)
您无法在重写方法中更改类型参数的数量。至于你的情况,覆盖明显失败,返回类型。但即使返回类型相同,您的方法仍然不会覆盖等效,因为您在所谓的重写方法中具有较少的类型参数。
如果两个方法具有相同的名称,则它们具有相同的签名 参数类型。
两个方法或构造函数声明M和N具有相同的参数 如果满足以下所有条件,则输入类型:
- 它们具有相同数量的形式参数(可能为零)
- 他们有相同数量的类型参数(可能为零)
因此,即使以下代码也会失败:
interface Demo {
public <S, T> void show();
}
class DemoImpl implements Demo {
@Override
public <T> void show() { } // Compiler error
}
由于类型参数较少,因此类中的方法show()
与接口中的方法不是覆盖等效。
因此,您应该确保方法签名与JLS部分中指定的完全相同(相同名称,相同数量和类型的参数(包括类型参数),共变量返回类型)。
答案 2 :(得分:1)
阅读上面的评论,我理解这种方法不起作用,所以我在代码中进行了一些更改并像魅力一样工作,遵循代码:
超类:
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;
}
谢谢你们。