当前位置: 首页 > 面试题库 >

Java-使用相同的方法和不同的返回类型实现多个接口

终翰学
2023-03-14
问题内容

考虑以下代码:

public interface A {
  public A another();
}

public interface B {
  public B another();
}

public interface AB extends A,B {
  public AB another();
}

这会导致以下错误AB

类型B和A不兼容;都定义了another(),但是返回类型不相关

我已经看到了这样的问题,并按照公认的答案中的不兼容示例进行操作-即

public interface C { 
  public void doSomething();
}

public interface D {
  public boolean doSomething();
}

public interface CD extends C,D { 
}

但是,在那种情况下,返回类型确实是不兼容的-返回类型不能同时为void和布尔值。而在上面的示例中,another()返回类型AB是an A和a
B,因此可以实现两个扩展接口。

此外,在查看了JLS(8.4.8、8.4.8.3、8.4.8.4)之后,我不太理解为什么我的示例在上面是非法的。谁能向我解释一下?

其次,除了重复AB中的合同要求之外,是否有其他解决方案/变通办法AB


问题答案:

对于Java
1.5之前的版本,会出现此错误消息(至少在Eclipse中将遵从级别设置为1.4时,我可以重现该错误)。换句话说,请确保您正在查看足够早的规格。

在Java> = 1.5上,以下命令可以正常编译。

interface A {
    public A another();
}

interface B {
    public B another();
}

interface AB extends A,B {
    public AB another();
}

如您所说,由于AB既是AB,也满足两个接口。

以下是Java语言规范(第二版,即Java 1.4)的引文:

9.2接口成员

接口的成员是:

  • 这些成员在接口中声明。
  • 这些 成员是从直接超级接口继承的
  • 如果接口没有直接的超级接口,则[…]

因此,如果接口 声明的方法具有相同的签名和不同的返回类型 或不兼容的throws子句,则将导致编译时错误。

此外, 当前 规范还表示以下内容:

9.4.2重载

如果接口的两种方法(都是在同一个接口中声明的,或者都是由一个接口继承的,或者一个声明且是一个继承的)的名称相同,但签名不同,那么它们不是等效的(第8.4.2节),则方法名称被认为是重载的。这个事实不会造成任何困难,并且它本身也不会导致编译时错误。返回类型之间或名称相同但签名不相同的两个方法的throws子句之间没有必需的关系。



 类似资料:
  • 只是延伸问题... 抽象类和接口中的相同方法 假设一个类实现了一个接口并扩展了一个抽象类,两者都有相同的方法(名称签名),但返回类型不同。现在,当我重写方法时,只有当我使返回类型与接口声明相同时,它才会编译。 另外,如果该方法在抽象类或接口中声明为private或final,会发生什么情况? **旁注。在一次采访中,爱因斯坦先生在这个问题上坚持了相当长的时间。有没有一个流行的场景,我们这样做,或者

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

  • 问题内容: 今天,我偶然发现了一些我什至没想到可以编译的Java代码。减少到最低限度,它看起来像这样: 乍一看,类型参数的的方法和期待,因为没有必要,不使用其他任何地方。无论如何,我发现这在允许冲突的返回值类型共存于同一实现中起着至关重要的作用:如果忽略了一个或两个,则代码不会编译。这里是非工作版本: 我不需要修复上面的代码片段,因为这些只是我用来解释我观点的示例。我只是想知道为什么编译器对它们的

  • 我可以看到它不工作,因为我尝试了它。我只是无法解释为什么一定要这样。 第二个方法来自一个类,该类是实现第一个getValue()方法的类的子类。 为什么同名不足以覆盖该方法?我想到的唯一论点是,它将反对“是一个”关系,因为用A扩展的第二个方法的类必须具有与A相同的能力,如果你重写返回类型,你就打破了那个法律,对吧?

  • 问题内容: 说我有两个结构: 我希望他们都实现接口A: 像这样对First和Second结构都实现似乎是多余的: 有没有一种方法可以为实现接口A的所有结构提供一个实现?像这样的东西,但似乎不起作用: 谢谢! 问题答案: 不,您不能, 但是 您可以创建一个基本类型,然后将其嵌入到您的2结构中,因此只需要一个基本类型的实现即可: 用法: 操场上的完整例子 嵌入文件

  • 在执行基本方法重载程序时,我始终收到以下错误: sh-4.3 $ javac HelloWorld . Java < br > HelloWorld . Java:10:错误:方法show()已在类hello world中定义< br > static void show()< br > hello world . Java:25:错误:方法show(int,int)已在类hello world中