当前位置: 首页 > 知识库问答 >
问题:

同时覆盖具有泛型异常和泛型类型的方法

宓诚
2023-03-14

我在覆盖接口中声明的方法时遇到了一些问题,该方法使用泛型参数作为其异常,并使用泛型作为其参数之一。为了说明,我编写了以下代码接口

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(Implementadora)的metodoB(metodoB)(代码)不重写Interfaz(代码),但重写metodoB(代码)的方式是一样的?

共有1个答案

谢鸿飞
2023-03-14

您不能期望字符串在方法A和方法B中返回,请查看您的接口,这里是编译的版本

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

}

 类似资料:
  • 我有一个问题,从抽象类中重写泛型方法。 这是我的抽象类: 当我创建类(B)来实现类(a)时,如下所示: 显示了(getData)方法中的以下编译错误: ”“B。getData“(“字符串函数(字符串)”不是“a”的有效重写。getData'('字符串函数(类型)‘)。dart(无效覆盖) 以及返回语句中的此错误: 类型为“String”的值不能从方法'getData'返回,因为它的返回类型为'St

  • 我想在我的android项目中自动转换视图。所以,我想重写 方法 方法但是java编译不允许这样做,但是重写的方法不会与父方法冲突,并且总是返回视图对象或其子对象。我发现了一些信息,java不允许用泛型方法重写非泛型方法,但我找不到解释。 http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ8

  • 在研究泛型时,我注意到泛型方法和泛型类型(类或接口)在类型引入语法上的一个差异使我感到困惑。 泛型方法的语法为 文件上说 为了彼此保持一致,我希望方法语法为 ,或者类型语法(for class)为,但事实显然并非如此。 为什么一个要介绍在前,另一个要介绍在后? 我主要以的形式使用泛型,并认为可能看起来很奇怪,但这是一个主观的参数,此外对于方法也是这样。您可以调用,类似于 在寻找技术解释时,我想在指

  • 我正在尝试理解使用以下代码得到的名称冲突错误: 错误消息: 错误:名称冲突:

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 我正在尝试用来自spring WebFlux的WebClient制作一个客户端库。 服务器返回如下JSON所示的响应: 结果字段包含元素数组,这些元素可以根据使用的API而不同。 有关该API的更多信息,请参阅ServiceNow产品中的表API。 正如您在文档中所看到的,API路径如下所示:GET/now/table/{tableName},其中tableName可以是不同的值,tipology