これは初心者の質問のようです.Javaでは、someClass.classがanotherClass.classから派生したものであるかどうかをコンパイル時に、またはコンパイル時に不可能な場合は実行時にどのように確認できますか?
3 に答える
コード内:
anotherClass.class.isAssignableFrom( someClass.class );
他のクラスが実際のクラス (インターフェイスではない) であることも確認したい場合は、次の呼び出しを追加しますisInterface()
。
!anotherClass.class.isInterface() && anotherClass.class.isAssignableFrom( someClass.class );
例:
System.out.println( Number.class.isAssignableFrom( Integer.class )); // true
instanceof
インスタンスがなく、クラスしかないため、うまくいかないことに注意してください。
の Javadoc からの抜粋Class.isAssignableFrom
:
この Class オブジェクトによって表されるクラスまたはインターフェースが、指定された Class パラメーターによって表されるクラスまたはインターフェースと同じであるか、そのスーパークラスまたはスーパーインターフェースであるかを判断します。その場合は true を返します。それ以外の場合は false を返します。この Class オブジェクトがプリミティブ型を表す場合、指定された Class パラメータがまさにこの Class オブジェクトであれば、このメソッドは true を返します。それ以外の場合は false を返します。
他の人がすでに示唆しているように、ランタイムのチェックインは簡単です。ただし、少しのトリックでコンパイル時に実行することは可能です。
ジェネリックスを利用して、次のようなメソッドを作成できます。
public static <A, B extends A> void isExtends(Class<A> clazzA, Class<B> clazzB) {
// empty
}
someClass.classがanotherClass.classから派生していることを確認したい場合は、コードを入力するだけです。
isExtends(AnotherClass.class, SomeClass.class);
コンパイラは、SomeClassがAnotherClassから拡張されているかどうかを確認するのに役立ちます。
(しかし、正直なところ、これは実際に実際に役立つものであるかどうか疑問に思います:P)
Class.isAssignableFrom()
クラスしかない場合は実行時にチェックでき、instanceof
インスタンスがある場合はオペレーターでチェックできます。
コンパイル時間に関しては、質問がわかりません。そして、なぜコードを書いている人は、コンパイルする前にそれを知らなかったのでしょうか?