为啥一个接口不能实现另一个接口?

Posted

技术标签:

【中文标题】为啥一个接口不能实现另一个接口?【英文标题】:Why an interface can not implement another interface?为什么一个接口不能实现另一个接口? 【发布时间】:2011-04-24 16:46:49 【问题描述】:

我的意思是:

interface B ...

interface A extends B ... // allowed  

interface A implements B ... // not allowed

我google了一下,发现this:

implements 表示为接口的方法定义一个实现。但是接口没有实现,所以这是不可能的。

但是,接口是一个100%抽象类,一个抽象类可以实现接口(100%抽象类)而不用实现它的方法。定义为“接口”有什么问题?

详细一点,

interface A 
    void methodA();


abstract class B implements A  // we may not implement methodA() but allowed

class C extends B 
   void methodA()
 

interface B implements A  // not allowed. 
//however, interface B = %100 abstract class B

【问题讨论】:

【参考方案1】:

implements 表示实现,而interface 表示声明只是为了提供interface 不用于实现。

100% abstract class 在功能上等同于 interface 但如果您愿意,它也可以实现(在这种情况下,它不会保持 100% abstract),所以从 JVM 的角度来看,它们是不同的东西。

此外,100% 抽象类中的成员变量可以具有任何访问限定符,在接口中它们隐式为 public static final

【讨论】:

从 Java 8 开始,接口可以有默认方法,这使得它们在这方面更类似于抽象类。 谢谢最后一句!【参考方案2】:

implements 表示将为abstract 方法定义一个行为(显然抽象类除外),您定义实现。

extends 表示一个行为是继承的。

对于接口,可以说一个接口应该具有与另一个接口相同的行为,甚至没有实际的实现。这就是为什么一个接口到extends 另一个接口而不是实现它更有意义。


附带说明,请记住,即使 abstract 类可以定义 abstract 方法(接口所做的正常方式),它仍然是一个 ,仍然必须被继承(扩展)但未实施。

【讨论】:

【参考方案3】:

从概念上讲,有两个“域”类和接口。在这些你总是在扩展的领域中,只有一个类实现了一个接口,这有点“跨越边界”。所以基本上接口的“扩展”反映了类的行为。至少我认为这是背后的逻辑。似乎不是每个人都同意这种逻辑(我自己觉得有点做作),实际上完全没有技术理由有两个不同的关键字。

【讨论】:

如果“Y 扩展 X”并且未密封,则可能有另一种类型“Z”扩展“Y”。无论 X 是接口还是类,这都是正确的。但是,如果“W 实现 X”,则不可能有“V 实现 W”。 “extends”可以“chained”,“implements”不能成为使用不同关键字的好理由。【参考方案4】:

但是接口是100%抽象类,抽象类可以 实现接口(100% 抽象类)而不实现其 方法。定义为“接口”有什么问题?

这只是一个约定俗成的问题。 Java 语言的作者认为“扩展”是描述这种关系的最佳方式,所以我们都使用这种方式。

一般来说,即使接口是“100% 的抽象类”,我们也不会这样看待它们。我们通常将接口视为实现某些关键方法的承诺,而不是派生自的类。因此,我们倾向于对接口使用与类不同的语言。

正如其他人所说,选择“扩展”而不是“实现”是有充分理由的。

【讨论】:

是的,先生。这是一个约定俗成的问题。许多人试图证明逻辑上 Sun 的原始Java 语言限制是合理的,但这只是个人观点。如果编译器添加了“实现”接口,我想同样的人也会证明它是合理的。 :-)【参考方案5】:

希望这能对我在大学期间在 oops(核心 java)方面学到的一些知识有所帮助。

Implements 表示为接口的方法定义一个实现。但是接口没有实现,所以这是不可能的。然而,一个接口可以扩展另一个接口,这意味着它可以添加更多方法并继承其类型。

下面是一个例子,这是我的理解和在oops中学到的。

interface ParentInterface  
        void myMethod();  
  

interface SubInterface extends ParentInterface  
        void anotherMethod();  
  

记住一件事,一个接口只能扩展另一个接口,如果你想在某个类上定义它的功能,那么只能实现一个接口,例如下面

public interface Dog

    public boolean Barks();

    public boolean isGoldenRetriever();

现在,如果一个类要实现这个接口,它会是这样的:

public class SomeClass implements Dog

    public boolean Barks
    // method definition here

    

    public boolean isGoldenRetriever
    // method definition here
    

如果一个抽象类有一些抽象函数定义和声明并且你想定义这些函数或者你可以说实现那些函数那么你应该扩展那个类,因为抽象类只能被扩展。下面是一个例子。

public abstract class MyAbstractClass 

    public abstract void abstractMethod();

这是 MyAbstractClass 的一个示例子类:

public class MySubClass extends MyAbstractClass 

    public void abstractMethod() 
        System.out.println("My method implementation");
    

【讨论】:

【参考方案6】:

接口就像一个抽象,不提供任何功能。因此,它没有“实现”,而是扩展了其他抽象或接口。

【讨论】:

【参考方案7】:

Interface是一个包含抽象方法的类,不能创建任何对象。由于Interface不能创建对象且不是纯类,所以不值得实现。

【讨论】:

以上是关于为啥一个接口不能实现另一个接口?的主要内容,如果未能解决你的问题,请参考以下文章

为啥静态类不能实现接口? [复制]

█■为啥要用实现接口的类实例化接口呢? ?

为啥 PHP Trait 不能实现接口?

█■为啥要用实现接口的类实例化接口呢?

为啥接口的显式实现不能公开?

为啥不能隐式实现非公共接口成员?