web-dev-qa-db-ja.com

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

私が意味するのは:

interface B {...}

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

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

私はそれをグーグルで見つけました 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
101
user467871

implementsは実装を意味します。interfaceは、実装のためではなくinterfaceを提供するためだけに宣言するものです。

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

また、100%抽象クラスのメンバー変数には、インターフェイス内で暗黙的にpublic static finalであるアクセス修飾子を含めることができます。

103
Jigar Joshi

implementsは、動作がabstractメソッドに対して定義されることを意味し(明らかに抽象クラスを除く)、実装を定義します。

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

インターフェイスを使用すると、1つのインターフェイスが別のインターフェイスと同じ動作をする必要があると言うことができ、実際の実装さえありません。 extends別のインターフェイスへのインターフェイスを実装するよりも、それがより理にかなっているのはそのためです。


サイドノートで、abstractクラスがabstractメソッドを定義できる場合(インターフェースが行うのと同じ方法)でも、classであり、さらに継承(拡張)および実装されていません。

24
Colin Hebert

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

4
Landei

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

これは単に慣習の問題です。 Java言語の作者は、「拡張」がこの関係を記述する最良の方法であると判断したため、私たち全員が使用しています。

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

他の人が述べているように、「実装」ではなく「拡張」を選択する正当な理由があります。

2
Josiah Yoder

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

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

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

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