インターフェースが別のインターフェースを実装できないのはなぜですか?


104

つまり、

interface B {...}

interface A extends B {...} // allowed  

interface A implements B {...} // not allowed

私はそれをグーグルで調べて、これを見つけまし

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

回答:


110

implements実装をinterface意味しinterface、実装のためではないことを宣言することを意味する場合、実装を意味します。

100%abstract classは機能的にはと同等ですが、interface必要に応じて実装することもできます(この場合は100%のままではありませんabstract)。そのため、JVMの観点からは、それらは異なるものです。

また、100%抽象クラスのメンバー変数は、任意のアクセス修飾子を持つことができますpublic static final。インターフェイスでは、これらの変数は暗黙的に指定されます。


8
Java 8の時点で、インターフェースにはデフォルトのメソッドがあり、その点で抽象クラスに非常に似ています。
フォレストホプキンサ2017年

4
最後の文章ありがとうございます!
Tao Zhang

24

implementsabstractメソッドに対して振る舞いが定義されることを意味します(抽象クラ​​スを除く)、実装を定義します。

extends 動作が継承されることを意味します。

インターフェースでは、あるインターフェースが別のインターフェースと同じ振る舞いを持つべきであると言うことができ、実際の実装すらありません。そのため、extends実装するのではなく、別のインターフェースへのインターフェースの方が理にかなっています。


余談ですが、 abstractabstract余談クラスがメソッドを定義できる(インターフェースが行う正しい方法)、クラスクラスであり、継承(拡張)され、実装されない必要があることに注意してください。


4

概念的には、2つの「ドメイン」クラスとインターフェースがあります。これらのドメイン内では常に拡張されており、「境界を越える」ようなインターフェースを実装するのはクラスだけです。したがって、基本的にインターフェースの「拡張」は、クラスの動作を反映しています。少なくとも私はこれが背後にある論理だと思います。誰もがこの種の論理に同意するわけではないようです(私は少し工夫したと思います)。実際、2つの異なるキーワードを使用することには技術的な理由がありません。


「YがXを拡張する」でシールされていない場合、「Y」を拡張する別のタイプ「Z」を使用することができます。これは、Xがインターフェイスであってもクラスであっても当てはまります。ただし、「WがXを実装する」場合は、「VがWを実装する」ことはできません。「拡張」を「連鎖」させ、「実装」を行うことができないという事実は、異なるキーワードを持つための良い理由のように思われます。
スーパーキャット2013

2

ただし、インターフェイスは100%抽象クラスであり、抽象クラスはメソッドを実装せずにインターフェイス(100%抽象クラス)を実装できます。それが「インターフェース」として定義されているときの問題は何ですか?

これは単に慣例の問題です。Java言語の作成者は、「拡張」がこの関係を説明する最良の方法であると決定しました。そのため、私たちはそれを使用しています。

一般に、インターフェイスは「100%抽象クラス」ですが、そのように考えることはありません。通常、インターフェイスは、派生するクラスではなく、特定の主要なメソッドを実装することを約束するものと考えています。そのため、インターフェイスとクラスでは異なる言語を使用する傾向があります。

他の人が述べているように、「実装」よりも「拡張」を選択することには十分な理由があります。


かしこまりました。それは慣習の問題です。多くの人々は、Sunの元のJava言語の制約を論理的に正当化しようとします。コンパイラーが「実装」インターフェースを許可している場合、私も同じ人がそれを正当化したと思います。:-)
リトルサンティ

1

これが私の大学の間に私がおっと(コアJava)で学んだことを少しでもお役に立てば幸いです。

実装は、インターフェースのメソッドの実装を定義することを意味します。ただし、インターフェースには実装がないため、これは不可能です。ただし、インターフェースは別のインターフェースを拡張できます。つまり、メソッドを追加してその型を継承できます。

以下に例を示します。これは私の理解であり、私がおっとで学んだことです。

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");
    }
}

0

インターフェイスは、機能を提供しない抽象概念のようなものです。したがって、「実装」するのではなく、他の抽象化またはインターフェースを拡張します。


-6

インターフェースは、オブジェクトを作成できない抽象メソッドを含むクラスです。インターフェースはオブジェクトを作成できず、純粋なクラスではないため、実装する価値はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.