【问题标题】:Can an interface extend multiple interfaces in Java?一个接口可以在Java中扩展多个接口吗?
【发布时间】:2013-11-02 00:07:09
【问题描述】:

一个接口可以在 Java 中扩展多个接口吗?此代码在我的 IDE 中显示有效,并且可以编译:

interface Foo extends Runnable, Set, Comparator<String> { }

但我听说 Java 中不允许多重继承。为什么接口似乎存在异常?

【问题讨论】:

  • 哪些文章说不可能?他们要么错了,要么你误解了他们,他们在谈论类而不是接口。
  • 这个问题似乎是题外话,因为它可以很容易地通过自我研究来回答
  • @StephenC 如果他确实发现了矛盾的文章,他应该发布它们。这样人们就知道不要阅读那些文章......
  • 这个问题的答案为我节省了时间。我认为它具有作为一个有效问题的价值。
  • 有用的问题,我这样做是希望我的 IDE 抛出一些警告,很惊讶没有看到。所以我在不知不觉中在谷歌中输入了与操作相同的问题,这导致我进入此页面并提供了一些答案/确认

标签: java inheritance multiple-inheritance extends


【解决方案1】:

是的,你可以做到。一个接口可以扩展多个接口,如下所示:

interface Maininterface extends inter1, inter2, inter3 {  
  // methods
}

一个类也可以实现多个接口。如果两个接口有一个定义相同名称和签名的方法怎么办?

有一个棘手的地方:

interface A {
    void test();
}

interface B {
    void test();
}

class C implements A, B {

    @Override
    public void test() {

    }     

}

然后单一实现适用于两者:)。

在这里阅读我的完整帖子:

http://codeinventions.blogspot.com/2014/07/can-interface-extend-multiple.html

【讨论】:

  • @RahulBhadana 抽象方法应该重写吧?
  • 如果你有接口 A 和 void test() 和接口 B 和 boolean test() 怎么办? (这是diamond problem 的表亲吗?) __试过了,明智的事情发生了:如果返回类型不同,则不允许。
  • @sureshatta - 那么会发生什么?它调用两者 ??
  • 一个类不允许两个方法相同的签名具有不同的返回类型。 stackoverflow.com/questions/16149285/…
【解决方案2】:

一个接口可以扩展多个接口

一个可以实现多个接口

但是,只能扩展单个类

在谈论interfaceclass 时,请注意如何使用extendsimplements

【讨论】:

    【解决方案3】:

    从关于多继承类型的Oracle文档页面中,我们可以找到准确的答案here。 这里我们首先要知道java中多重继承的类型:-

    1. 状态的多重继承。
    2. 实现的多重继承。
    3. 类型的多重继承。

    Java“不支持状态的多重继承,但它支持使用自 java 8 发布以来的默认方法的实现的多重继承和接口的类型的多重继承。

    那么这里的问题是“钻石问题”以及Java如何处理这个问题:-

    1. 如果实现的多重继承,java编译器会给出编译错误并要求用户通过指定接口名称来修复它。 这里的例子:-

                  interface A {
                      void method();
                  }
      
                  interface B extends A {
                      @Override
                      default void method() {
                          System.out.println("B");
                      }
                  }
      
                  interface C extends A { 
                      @Override
                      default void method() {
                          System.out.println("C");
                      }
                  }
      
                  interface D extends B, C {
      
                  }
      

    所以在这里我们会得到错误:- 接口 D 从类型 B 和 C 继承了 method() 的不相关默认值 interface D extends B, C

    你可以像这样修复它:-

    interface D extends B, C {
                    @Override
                    default void method() {
                        B.super.method();
                    }
                }
    
    1. 在 java 类型的多重继承中允许这样做,因为接口不包含可变字段,并且只有一个实现将属于该类,因此 java 不会产生任何问题,它允许您这样做。

    在结论中,我们可以说 java 不支持 状态的多重继承,但它支持 实现的多重继承和类型的多重继承

    【讨论】:

    • 我认为这是一个更合适的答案,更能澄清问题。 +1
    • 谢谢@KetanJoshi,这激励了很多人继续前进:)
    • 接口不能像你的例子那样定义方法。
    • @Danger 这里的重点不是定义接口内部的方法,显然我们可以从 Java 8 定义它。希望我已经回答了你。谢谢尚卡尔
    • 嗨@shankarupadhyay,我只是说如果你正在定义接口,那么不要将方法实现放在接口中,只需声明方法或使用类。作为开发人员,我们不应该犯这些错误,即使关注点在其他事情上。
    【解决方案4】:

    一个接口可以在java中扩展多个接口吗?

    答案是:是的。

    根据JLS

    一个接口可以被声明为一个或多个的直接扩展 其他接口,意味着它隐式指定所有成员 它扩展的接口的类型、抽象方法和常量, 除了它可能隐藏的任何成员类型和常量。

    【讨论】:

    • JLS = "Java Language Specification" 这是这些问题的权威来源。
    【解决方案5】:

    您可以扩展多个Interfaces,但不能扩展多个classes

    在 Java 中无法扩展多个类的原因是 C++ 的糟糕体验。

    多重继承的替代方案是一个类可以实现多个接口(或者一个接口可以扩展多个接口)

    【讨论】:

      【解决方案6】:

      我认为您的困惑在于多重继承,在这种情况下这样做是不好的做法,而在 Java 中这也是不可能的。但是,在Java中实现多个接口是允许的,而且也是安全的。

      【讨论】:

        【解决方案7】:

        Java 类只能扩展一个父类。不允许多重继承。但是,接口不是类,一个接口可以扩展多个父接口。

        例如,看看这里:http://www.tutorialspoint.com/java/java_interfaces.htm

        【讨论】:

          猜你喜欢
          • 2018-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-13
          • 2015-10-16
          • 1970-01-01
          相关资源
          最近更新 更多