【问题标题】:Overriding a method with generic exception and generic type at the same time同时覆盖泛型异常和泛型类型的方法
【发布时间】: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 方法不会覆盖或实现超类型中的方法

请注意,在界面中,metodoAmetodoB 之间的唯一区别在于它们的参数。

为什么ImplementadorametodoB() 不覆盖InterfazmetodoB(),但覆盖metodoA() 的方法相同?

【问题讨论】:

  • 呃。 &lt;ARGUMENT_EXCEPTION extends IllegalArgumentException&gt; 并不意味着它抛出IllegalArgumentExceptionsome 子类型,而是意味着该方法的用户可以指定 IllegalArgumentException 的子类型被抛出。事实并非如此。
  • 为什么不声明接口方法只是为了抛出IllegalArgumentException?我很难看到泛型的价值。

标签: java generics


【解决方案1】:

你不能期望在methodA和methodB中返回Strings看看你的界面这里是编译的版本

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

}

【讨论】:

    猜你喜欢
    • 2012-03-01
    • 2012-09-09
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多