2016-05-08 120 views
0

我在覆蓋在接口中聲明的方法時遇到了一些問題,該方法使用泛型參數作爲其異常並將泛型用作其參數之一。爲了說明這一點,我寫了下面的代碼接口&類同時覆蓋泛型異常和泛型類型的方法

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

運行此通過javac的,我得到

 
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 

注意的是,在接口,metodoAmetodoB之間唯一的區別是他們的爭論。

爲什麼ImplementadorametodoB()不會覆蓋InterfazmetodoB(),但壓倒一切的metodoA()相同的方式工作?

+2

呃版本。 ''ARGUMENT_EXCEPTION extends IllegalArgumentException''並不意味着它會拋出'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 

}