6

JLS 2.13.1 インターフェイス修飾子

そのようなクラスの実装は決して完了することができないため、インターフェイスを final にすることはできません。

インターフェイスにcreate static inner classesを書くことができれば、その中に実装を提供できるので、なぜそのような制限があるのですか

interface Type {

    // Normal
    class Value {
        private Value() {
        }

        public void print() {
            System.out.println("Test");
        }
    }

    public final Value value = new Value();
}
4

4 に答える 4

9

インターフェイスでは、実装の形式をまったく提供できません。静的メソッドでさえも提供できません。メソッドはまだ実装されていないため、final にすることは意味がありません。

コード例:

IExampleという名前のインターフェースとその具体的な実装があるとしましょうExample

interface IExample{

    public final void run();

}

class Example implements IExample{

    // wait! I can't override because it's final! but it's yet to be implemented?!
    public void run(){ 
        
    }

}
于 2012-09-10T12:25:18.590 に答える
4

ところで: この制限が最初に定義されたとき、ネストされたクラスは利用できませんでした。


finalクラスにサブクラスを含めることはできません。サブクラスのメソッドを定義するためにのみインターフェースを使用することがベストプラクティスと考えられているため、この 2 つは矛盾しています。

他のものにインターフェイスを使用できます

  • 注釈
  • javadoc
  • 定数
  • ネストされたクラスのみを定義します。

しかし、これらはインターフェースの目的に付随するものです。

于 2012-09-10T12:27:48.947 に答える
1

「最後のキーワードがクラス宣言に現れるとき、それはクラスがサブクラス化またはオーバーライドされないことを意味します。これにより、特定のクラスの過度の専門化が防止されます。ある意味で、クラスを作成した人は、それ以上の変更は接線であると考えましたその主な目的のために。」

参考:ファイナル

インターフェイスは実装ではなく動作を表すため、それが最終的なものであることに意味はありません。

于 2012-09-11T11:22:22.377 に答える
0

インターフェイスにcreate static inner classesを書くことができれば、その中に実装を提供できるので、なぜそのような制限があるのですか

はい、そこで内部クラスを宣言できますがfinal、インターフェイスは実装できないインターフェイスであることに注意してください。それを実装したクラスは、final制限に違反しています。Java 設計者は、これはあまり意味がないと結論付けました。また、ネストされたクラス*を持つインターフェイスの説得力のある使用例がないため、この制限を緩和する正当な理由はありません。final

* - ユースケースを発明できなかったと主張するつもりはありません。ただし、インターフェイスを実装しないことを意図して、内部クラスを使用してインターフェイスを作成する人については聞いたことがありません。

于 2012-09-10T12:41:03.270 に答える