2016-05-08 9 views
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"); 
     } 
} 

を説明するために、私はインターフェイスで、metodoAmetodoBの唯一の違いは、その引数である、ということ

 
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 

お知らせを取得します。

なぜImplementadorametodoB()が、オーバーライドmetodoA()同じように作品のmetodoB()Interfazを上書きすることはありませんか '?

+2

をコンパイルしたバージョンです。 'は' IllegalArgumentException'の_some_サブタイプをスローすることを意味するのではなく、メソッドの_userがスローされる 'IllegalArgumentException'のサブタイプを指定できることを意味します。これはそうではありません。 –

+2

IllegalArgumentExceptionをスローするだけのインターフェースメソッドを宣言してみませんか?私はそれのジェネリック医薬品の価値を見るのに苦労しています。 – sisyphus

答えて

0

あなたのインターフェースを見て文字列がmethodAとmethodBに返されることを期待することはできませんここええと

class Implementadora implements Interfaz { 

@Override 
public <ARGUMENT_EXCEPTION extends IllegalArgumentException> String metodoA(String[] params) 
     throws ARGUMENT_EXCEPTION { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public <ARGUMENT_EXCEPTION extends IllegalArgumentException> String metodoB(List<String> params) 
     throws ARGUMENT_EXCEPTION { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public <ARGUMENT_EXCEPTION extends IllegalArgumentException> String metodoC(List<String> params) 
     throws ARGUMENT_EXCEPTION { 
    // TODO Auto-generated method stub 
    return null; 
} 
    //This overrides metodoA correctly 

}

関連する問題