【发布时间】:2016-05-08 16:58:38
【问题描述】:
我在重写接口中声明的方法时遇到了一些麻烦,该方法使用泛型参数作为其异常,并使用泛型作为其参数之一。为了说明,我写了如下代码接口&类
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运行,我得到了
线路:14 Implementadora 不是抽象的,并且不会覆盖 Interfaz 中的抽象方法metodoB(java.util.List) 线路:23 名称冲突:Implementadora 中的metodoB(java.util.List) 和Interfaz 中的metodoB(java.util.List) 具有相同的擦除,但都不会覆盖另一个 线路:22 方法不会覆盖或实现超类型中的方法请注意,在界面中,metodoA 和 metodoB 之间的唯一区别在于它们的参数。
为什么Implementadora 的metodoB() 不覆盖Interfaz 的metodoB(),但覆盖metodoA() 的方法相同?
【问题讨论】:
-
呃。
<ARGUMENT_EXCEPTION extends IllegalArgumentException>并不意味着它抛出IllegalArgumentException的some 子类型,而是意味着该方法的用户可以指定IllegalArgumentException的子类型被抛出。事实并非如此。 -
为什么不声明接口方法只是为了抛出IllegalArgumentException?我很难看到泛型的价值。