例を考えてみましょう(Javaでコンパイルします)
public abstract interface Interface {
public void interfacing();
public abstract boolean interfacing(boolean really);
}
インターフェイスを抽象的に「宣言」する必要があるのはなぜですか?抽象インターフェースに適用される他のルールはありますか?
最後に:abstract
が廃止された場合、なぜJavaに含まれているのですか?抽象インターフェースの歴史はありますか?
インターフェイスを抽象的に「宣言」する必要があるのはなぜですか?
そうではありません。
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」部分はなくなる可能性があります。
=0
がabstract
キーワードに置き換えられたと仮定すると、インターフェイスメソッドにabstract
が何らかの時点で必須であると思われます。
インターフェイスメソッドのpublic
のように、必須ではありません。オプションです。
これに関するJLSを参照してください。
http://Java.Sun.com/docs/books/jls/second_edition/html/interfaces.doc.html
9.1.1.1抽象インターフェースすべてのインターフェースは暗黙的に抽象です。この修飾子は廃止されたため、新しいプログラムで使用しないでください。
そして
9.4抽象メソッド宣言
[...]
古いバージョンのJavaプラットフォームとの互換性のために、スタイルの問題として、インターフェースで宣言されたメソッドの抽象修飾子を冗長に指定することは許可されていますが、推奨されません。
インターフェイスメソッドのpublic修飾子を重複して指定することは許可されていますが、スタイルの問題として強く推奨されていません。
インターフェイス抽象を宣言する必要はありません。
これらのすべてのメソッドをpublic(インターフェイスがpublicの場合は既に存在する)またはabstract(すでにインターフェイスに存在する)を宣言するのと同じように冗長です。
しかし、誰もあなたを止めることはありません。
明示的に述べることはできますが、する必要はありません:
extends Object
抽象インターフェースに適用される他のルールはありますか?
インターフェイスはすでに「抽象的」です。そのキーワードを再度適用しても、まったく違いはありません。
春には学術的な意味がないことに注意してください。抽象インターフェースは、@Autowired
に使用しないことを開発者に警告するものです。 spring/Eclipse @Autowired
がこの属性を見て、その使用について警告/失敗することを願っています。
実際の例:@Transnationalから@Repositoryへの@Serviceプロキシは同じ基本メソッドを使用する必要がありますが、@Autowired
によりこの抽象インターフェイスを拡張する異なるインターフェイスを使用する必要があります。 (私はこれをXXXSpecインターフェースと呼んでいます)
すべてのインターフェイスは暗黙的に抽象的です。
この修飾子は廃止されたため、新しいプログラムでは使用しないでください。
[Java言語仕様-9.1.1.1 abstract
インターフェイス]
また、インターフェイスメンバメソッドは暗黙的にpublic abstract
であることに注意してください。
[Java言語仕様-9.2インターフェイスメンバー]
なぜこれらの修飾子は暗黙的ですか?ここで役立つ他の修飾子はありません( 'no modifier'-modifierでもない)。したがって、明示的に入力する必要はありません。 。
インターフェース内のすべてのメソッドは抽象的であるため、インターフェースはデフォルトでは抽象的であるため、これは必要ありません。
必要ありません。それは言語の癖です。