web-dev-qa-db-ja.com

Java抽象インターフェース

例を考えてみましょう(Javaでコンパイルします)

public abstract interface Interface {
    public void interfacing();
    public abstract boolean interfacing(boolean really);
}

インターフェイスを抽象的に「宣言」する必要があるのはなぜですか?抽象インターフェースに適用される他のルールはありますか?


最後に:abstractが廃止された場合、なぜJavaに含まれているのですか?抽象インターフェースの歴史はありますか?

192
Buhake Sindi

インターフェイスを抽象的に「宣言」する必要があるのはなぜですか?

そうではありません。

public abstract interface Interface {
       \___.__/
           |
           '----> Neither this...

    public void interfacing();
    public abstract boolean interfacing(boolean really);
           \___.__/
               |
               '----> nor this, are necessary.
}

インターフェイスとそのメソッドは暗黙的にabstractであり、その修飾子を追加しても違いはありません。

抽象インターフェースに適用される他のルールはありますか?

いいえ、同じルールが適用されます。このメソッドは、(具体的な)実装クラスによって実装する必要があります。

抽象が廃止された場合、なぜJavaに含まれているのですか?抽象インターフェースの歴史はありますか?

興味深い質問。 JLSのfirstエディションを掘り下げましたが、それでも "この修飾子は廃止されており、新しい_で使用すべきではありませんJavaプログラム "

さて、さらに掘り下げます...多数の壊れたリンクを押した後、元のコピーを見つけることができました Oak 0.2仕様 (または「マニュアル」)。私が言わなければならない非常に興味深い読み物で、合計でわずか38ページです! :-)

セクション5インターフェースの下で、次の例を提供します。

public interface Storing {
    void freezeDry(Stream s) = 0;
    void reconstitute(Stream s) = 0;
}

そして、マージンにそれは言います

将来、インターフェースの宣言メソッドの「= 0」部分はなくなる可能性があります。

=0abstractキーワードに置き換えられたと仮定すると、インターフェイスメソッドにabstractが何らかの時点で必須であると思われます。


関連記事: Java:抽象インターフェースと抽象インターフェースメソッド

439
aioobe

インターフェイスメソッドのpublicのように、必須ではありません。オプションです。

これに関するJLSを参照してください。

http://Java.Sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

9.1.1.1抽象インターフェースすべてのインターフェースは暗黙的に抽象です。この修飾子は廃止されたため、新しいプログラムで使用しないでください。

そして

9.4抽象メソッド宣言

[...]

古いバージョンのJavaプラットフォームとの互換性のために、スタイルの問題として、インターフェースで宣言されたメソッドの抽象修飾子を冗長に指定することは許可されていますが、推奨されません。

インターフェイスメソッドのpublic修飾子を重複して指定することは許可されていますが、スタイルの問題として強く推奨されていません。

36
Lukas Eder

インターフェイス抽象を宣言する必要はありません。

これらのすべてのメソッドをpublic(インターフェイスがpublicの場合は既に存在する)またはabstract(すでにインターフェイスに存在する)を宣言するのと同じように冗長です。

しかし、誰もあなたを止めることはありません。

明示的に述べることはできますが、する必要はありません:

  • コンストラクターの最初の行でsuper()を呼び出します
  • extends Object
  • 継承されたインターフェースを実装する

抽象インターフェースに適用される他のルールはありますか?

インターフェイスはすでに「抽象的」です。そのキーワードを再度適用しても、まったく違いはありません。

11
Thilo

春には学術的な意味がないことに注意してください。抽象インターフェースは、@Autowiredに使用しないことを開発者に警告するものです。 spring/Eclipse @Autowiredがこの属性を見て、その使用について警告/失敗することを願っています。

実際の例:@Transnationalから@Repositoryへの@Serviceプロキシは同じ基本メソッドを使用する必要がありますが、@Autowiredによりこの抽象インターフェイスを拡張する異なるインターフェイスを使用する必要があります。 (私はこれをXXXSpecインターフェースと呼んでいます)

7
Adi Lev

すべてのインターフェイスは暗黙的に抽象的です。
この修飾子は廃止されたため、新しいプログラムでは使用しないでください。

[Java言語仕様-9.1.1.1 abstractインターフェイス]

また、インターフェイスメンバメソッドは暗黙的にpublic abstractであることに注意してください。
[Java言語仕様-9.2インターフェイスメンバー]

なぜこれらの修飾子は暗黙的ですか?ここで役立つ他の修飾子はありません( 'no modifier'-modifierでもない)。したがって、明示的に入力する必要はありません。 。

3
kapex

インターフェース内のすべてのメソッドは抽象的であるため、インターフェースはデフォルトでは抽象的であるため、これは必要ありません。

2
Swagatika

必要ありません。それは言語の癖です。

2
Bohemian