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
注意的是,在接口,metodoA
和metodoB
之間唯一的區別是他們的爭論。
爲什麼Implementadora
的metodoB()
不會覆蓋Interfaz
的metodoB()
,但壓倒一切的metodoA()
相同的方式工作?
呃版本。 ''ARGUMENT_EXCEPTION extends IllegalArgumentException''並不意味着它會拋出'IllegalArgumentException'的_some_子類型,而是這意味着該方法的_user可以指定拋出'IllegalArgumentException'的子類型。不是這種情況。 –
爲什麼不聲明接口方法只是拋出IllegalArgumentException?我很努力地看到泛型的價值。 – sisyphus