1. ホーム

[解決済み】Javaでクラスオブジェクトが他のクラスオブジェクトのサブクラスであるかどうかを確認する

2022-04-17 15:53:16

質問

私はJavaのリフレクションAPIで遊んでいて、いくつかのフィールドを処理しようとしています。今、私はフィールドのタイプを識別することに行き詰っています。文字列は簡単で、ただ myField.getType().equals(String.class) . 他の非派生クラスも同様です。しかし、派生クラスはどのようにチェックすればよいのでしょうか?例えば LinkedList のサブクラスとして List . を見つけることができません。 isSubclassOf(...) または extends(...) メソッドを使用します。すべての getSuperClass() を作成し、自分自身でスーパークラスを見つけることができますか?

どのように解決するのですか?

この方法が欲しい。

boolean isList = List.class.isAssignableFrom(myClass);

一般的なところでは List (上記)は、次のように置き換える必要があります。 superclassmyClass に置き換える必要があります。 subclass

から JavaDoc :

で表されるクラスまたはインタフェースが、 この Class オブジェクトが表すクラスやインタフェースと同じであるか、またはそのスーパークラスやスーパーインタフェースであることを示します。 Class パラメータを使用します。このパラメータは true を返し、そうでない場合は false . もしこの Class オブジェクトがプリミティブ型を表している場合、このメソッドは true を指定した場合 Class パラメータは、まさにこの Class オブジェクトを返し、それ以外の場合は false .

参考にしてください。


関連する

a) コンパイル時に知っているクラスまたはインターフェース(サブクラスを含む)のインスタンスであるかどうかをチェックする。

boolean isInstance = someObject instanceof SomeTypeOrInterface;

assertTrue(Arrays.asList("a", "b", "c") instanceof List<?>);

b) Objectが、実行時にしか分からないClassやInterface(サブクラスも含む)のインスタンスであるかどうかを確認する。

Class<?> typeOrInterface = // acquire class somehow
boolean isInstance = typeOrInterface.isInstance(someObject);

public boolean checkForType(Object candidate, Class<?> type){
    return type.isInstance(candidate);
}