なぜインターフェイスでは、デフォルトのインターフェイスメソッドから静的インターフェイスメソッドを呼び出すことができませんがthis.staticInterfaceMethod()
、通常のクラスでは、インスタンスメソッドから静的クラスメソッドを呼び出すのに使用するのは完全に有効です this.staticClassMethod()
(スタイルは悪いですが)。
同時に、this
インターフェースのデフォルトのメソッド内で使用することは完全に有効です-私は合法的に次のことを行うことができます:
interface I {
int MY_CONST = 7;
static void st_f() {}
default void f1() {}
default void f_demo() {
this.f1(); // fine!
int locvar = this.MY_CONST; // also fine!
this.st_f(); // c.ERR: static method of interface I can only be accessed as I.st_f
}
}
「静的メソッドは、含まれているインターフェースクラスでのみ呼び出すことができます。」
静的メソッドは、インターフェースを実装するクラスによってインターフェースから継承されません(§8.4.8)。this
キーワードはしたがって呼び出すためにしようと、現在のオブジェクトを参照this.staticInterfaceMethod()
何とかオブジェクトがそれが静的インタフェースメソッドを継承して存在することを暗示します。これは起こり得ません。インターフェースはそれ自体ではインスタンス化できず、インターフェースの実装は静的メソッドを継承しませんでした。したがって、this.staticInterfaceMethod()
存在しないため、インターフェイス自体でメソッドを呼び出す必要があります。
静的メソッドを継承しない理由に関する簡単な説明は、次のシナリオです。
public interface InterfaceA {
public static void staticInterfaceMethod() {
...
}
}
public interface InterfaceB {
public static void staticInterfaceMethod() {
...
}
}
public class ClassAB implements InterfaceA, InterfaceB {
...
}
どの静的メソッドがClassAB
継承しますか?2つの静的メソッドは同じ署名を持っているため、呼び出しでは識別できません。どちらも他方を隠すことはありません。
同時に、インターフェイスのデフォルトメソッド内でこれを使用することは完全に有効です。
this
キーワードを使用してデフォルトのメソッド、変数などを参照することは許可されます。インターフェイスから継承する存在可能なすべてのオブジェクトがこれらのプロパティを継承するためです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加