0
インターフェイスで宣言されたメソッドをオーバーライドするときに問題があります。例外はジェネリックパラメータを例外に、ジェネリックを引数の1つとして使用します。 javacのを介してこれを実行すると、私は次のコードのインターフェイスを書いた&クラス一般的な例外とジェネリック型のメソッドを同時にオーバーライドする
package test;
import java.lang.IllegalArgumentException;
import java.util.List;
interface Interfaz {
<ARGUMENT_EXCEPTION extends IllegalArgumentException> String metodoA(String[] params) throws ARGUMENT_EXCEPTION;
<ARGUMENT_EXCEPTION extends IllegalArgumentException> String metodoB(List<String> params) throws ARGUMENT_EXCEPTION;
<ARGUMENT_EXCEPTION extends IllegalArgumentException> String metodoC(List<String> params) throws ARGUMENT_EXCEPTION;
}
class Implementadora implements Interfaz {
//This overrides metodoA correctly
@Override
public String metodoA(String[] params) throws IllegalArgumentException {
throw new IllegalArgumentException("ex");
}
//This one won't override metodoB, however
@Override
public String metodoB(List<String> params) throws IllegalArgumentException {
throw new IllegalArgumentException("ex");
}
//Ugly workaround (with unchecked cast)
@Override
public <ARGUMENT_EXCEPTION extends IllegalArgumentException> String metodoC(List<String> params) throws ARGUMENT_EXCEPTION {
throw (ARGUMENT_EXCEPTION)new IllegalArgumentException("ex");
}
}
を説明するために、私はインターフェイスで、metodoA
とmetodoB
の唯一の違いは、その引数である、ということ
Line: 14 Implementadora is not abstract and does not override abstract method metodoB(java.util.List) in Interfaz Line: 23 name clash: metodoB(java.util.List) in Implementadora and metodoB(java.util.List) in Interfaz have the same erasure, yet neither overrides the other Line: 22 method does not override or implement a method from a supertype
お知らせを取得します。
なぜImplementadora
のmetodoB()
が、オーバーライドmetodoA()
同じように作品のmetodoB()
Interfaz
を上書きすることはありませんか '?
をコンパイルしたバージョンです。 'は' IllegalArgumentException'の_some_サブタイプをスローすることを意味するのではなく、メソッドの_userがスローされる 'IllegalArgumentException'のサブタイプを指定できることを意味します。これはそうではありません。 –
IllegalArgumentExceptionをスローするだけのインターフェースメソッドを宣言してみませんか?私はそれのジェネリック医薬品の価値を見るのに苦労しています。 – sisyphus