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

实现两个都声明相同方法的接口时出现意外的编译器错误-(一个抽象,一个默认)

孔和风
2023-03-14

我试图理解为什么以下(下面的示例1)给我一个编译器错误,说明...

“ClassA从Interface1和Interface2类型继承test()的抽象和默认值”

...如果我将Interface1更改为抽象类,并让AClass扩展它(同时仍然实现Interface2),它的行为将与我预期的一样(没有编译器错误)。

我的理解是,抽象方法的优先级高于默认方法。换句话说,我希望示例1能够编译,就像示例2一样——并且从AClass派生的任何具体类都必须为test()方法提供实现。在这两个例子中,如果我从ClassA的定义中删除“abstract”,我会得到一个编译器错误(正如预期的那样),因为我没有提供那个实现。但是,为什么当AClass是抽象的时,它在实现2个接口时不编译,而在扩展ASupClass和实现Interface2时编译?为什么会有区别?

代码示例1(带有2个接口)

abstract class AClass implements Interface1, Interface2{  //Compiler error
}

interface Interface1{    
    public abstract String test();    
}

interface Interface2{
    default String test(){return "";}    
}

代码示例2(带有1个抽象类和1个接口)

abstract class AClass extends ASupClass implements Interface2{ //No compiler error
}

abstract class ASupClass{    
    public abstract String test();    
}

interface Interface2{
    default String test(){return "";}    
}

共有1个答案

史骏祥
2023-03-14

一个类不能实现两个公开具有相同签名的方法的接口。这与编译器有关,无法知道该类的哪个方法正在实现。一个方法被声明为抽象或默认并不重要,实际上认为必须实现一个抽象方法,也可以实现一个默认方法,导致歧义。

相反,第二个示例之所以能够编译,是因为没有歧义。默认方法提供了对test()方法的实现,因此具体类不必遵守与接口的约定,抽象类将默认实现理解为对其test()方法的实现。

 类似资料:
  • 问题内容: 此代码完美地工作。方法test()适用于两个接口。幕后到底发生了什么?在实际情况下,此功能有何用处? 问题答案: 因为它是一个接口,所以不会造成任何危害。通过实现和,您基本上是在为您的课程使用蓝图。双方并说,应实施一个名为方法 您的类实现了该方法,因此接口已完成其工作。 基本上,您的班级在说:“哦,我需要因为接口而实现”,然后您就实现了。然后您的班级说:“哦,嘿,由于接口我需要再次实现

  • 问题内容: 具有相同方法名称和签名的两个接口。但是由单个类实现,那么编译器将如何确定哪个方法用于哪个接口? 例如: 问题答案: 如果一个类型实现两个接口,并且每个接口定义一个具有相同签名的方法,则实际上只有一个方法,并且它们是不可区分的。例如,如果这两个方法的返回类型冲突,那么它将是编译错误。这是继承,方法重写,隐藏和声明的一般规则,并且不仅适用于两个继承的interface方法之间的可能冲突,还

  • 问题内容: 假设我有两个接口: 如果我想同时实现它们,那么将使用哪种实现? 问题答案: 这是一个编译时错误。您不能从两个接口获得两个实现。 但是,如果在中实现该方法,则是正确的: 我只想补充一点,即使I1中的方法是抽象的,而I2中的方法是默认的,您也无法实现它们两者。因此,这也是一个编译时错误:

  • 我有一个生产者,它获取数据A,产生数据B,并将其发送出去 为了证明我的问题,想象一下我有像上面这样的制作人。一个加载所有数据,然后在完成后立即批量发送,第二个立即发送数据(因此它不批量发送数据,但每当有新数据时,createdit立即发送) 大多数生产者会在每加载一个数据之后发送数据,但很少有人会马上发送。如果生产者立即发送数据,则方法将保持为空。然而,这似乎是一种糟糕的做法,可能违反了一些OOP

  • 问题内容: 这是我的代码,假设可以在按下按钮时更改一些文本:- 用下划线标记,它给我一个错误“类必须声明为抽象或实现抽象方法”。该代码大部分是从互联网上复制的,并且可以正常工作。可能仅是Android Studio错误。我如何使它工作? 问题答案: 必须实现该函数,否则您的类应该是抽象的,以便可以在某些子类中实现您的函数。但是在您的情况下,您犯了一个拼写错误。应该代替;

  • 问题内容: 假设我必须实现在两个不同的包中声明的两个不同的接口(在两个不同的独立项目中)。 我有包装 并包装 在我的包里 如何处理这种情况? 问题答案: 正如常见问题解答所提到的 其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。 在Go的类型系统中,仅按名称进行匹配并要求类型一致是简化的主要决定 。 在您的情况下,您将满足两个接口。 您可