7

メソッドを持つスーパークラスがあります:

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

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

そして、そのサブクラスの1つで、次のことを行いたい:

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

しかし、これはうまくいきません。問題は、スーパークラスへの参照があり、このメソッドを呼び出したいのですが、サブクラスの 1 つだけであるということです。

4

3 に答える 3

7

Javaオーバーライドによると

オーバーライドするメソッドは、オーバーライドするメソッドと同じ名前、パラメーターの数と型、および戻り値の型を持ちます。オーバーライド メソッドは、オーバーライドされたメソッドによって返される型のサブタイプを返すこともできます。これは、共変の戻り値の型と呼ばれます。

ここでは、メソッドの戻り値の型が異なるため、オーバーライドされていません。

于 2013-09-12T20:35:49.083 に答える
4

オーバーライドされたメソッドの型パラメーターの数を変更することはできません。あなたのケースに関しては、オーバーライドは明らかに戻り値の型で失敗します。ただし、戻り値の型が同じであったとしても、オーバーライドされるはずのメソッドの型パラメーターが少ないため、メソッドはオーバーライドと同等ではありません。

JLSから- メソッド署名:

名前と引数の型が同じである場合、2 つのメソッドは同じシグネチャを持ちます。

次の条件がすべて満たされる場合、2 つのメソッドまたはコンストラクタ宣言 M と N は同じ引数の型を持ちます。

  • それらは同じ数の仮パラメータを持っています (ゼロの可能性があります)
  • それらは同じ数の型パラメーターを持っています(おそらくゼロ)

したがって、次のコードでも失敗します。

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

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

クラスのメソッドshow()は、型パラメーターが少ないため、インターフェイスのメソッドと同等のオーバーライドではないためです。

したがって、その JLS セクションで指定されているように、メソッドのシグネチャがまったく同じであることを確認する必要があります (同じ名前、同じ数と型のパラメーター (型パラメーターを含む)、共変の戻り値の型)。

于 2013-09-12T20:46:42.603 に答える
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;

}

みんなありがとう。

于 2013-09-13T11:51:10.880 に答える