web-dev-qa-db-ja.com

オブジェクトが指定されたクラス名のリストのインスタンスであるかどうかを確認します

Object oString className = "org.foo.Foo"が与えられた場合、oList<className>のインスタンスであるかどうかを確認したい

私はこれを試しましたが、コンパイルしません:

Class<?> cls = Class.forName(className);
if (o instanceof List<cls>){ // this gives error: cls cannot be resolved to a type
  doSomething();
}

私の入力はObject oString classNameであることに注意してください(心のタイプを入力してください)。

13
lviggiani

OK、メソッドを見つけました...それは少し汚いコードですが、動作します:

if (o instanceof List<?>){
  ParameterizedType pt = (ParameterizedType)o.getClass().getGenericSuperclass();
  String innerClass = pt.getActualTypeArguments()[0].toString().replace("class ", "");
  System.out.println(innerClass.equals(className)); // true
}
6
lviggiani

Type Erasure が原因です。声明

if (o instanceof List<cls>) {
  doSomething();
}

リストのジェネリック型が消去される実行時に実行されます。したがって、instanceofジェネリック型をチェックする意味はありません。

11

私はあなたが2つのステップでそれを行うことができると思います:最初に、あなたはそれがリストであることを確認します。

if (o instanceof List)

次に、リストの1人(それぞれ?)のメンバーが指定されたタイプを持っていることを確認します。

for (Object obj : (List) o) {
    if (obj instanceof cls) {
        doSomething();
    }
}
9
Fabien Fleureau

私は私のプロジェクトで使用したソリューション。

/**
 * Used to get List of String From Object.
 *
 * 1. used to convert object to list of String.
 * 
 * @param objectList Object List.
 * @return List Of String.
 */
private List<String> getListOfStringFromObject(final Object objectList) {
    List<String> stringList = new ArrayList<>();
    if (objectList instanceof List<?>) {
        for (Object object : (List<?>) objectList) {
            if (object instanceof String) {
                stringList.add((String) object);
            }
        }
    }
    return stringList;
}
3
Vasanth
_public class Main{

    public static void main(String[] args){
        String str = "";
        int oi = 0;
        char c = 'a';
        Main af = new Main();
        checkType(str);
        checkType(oi);
        checkType(c);
        checkType(af);
    }

    public static void checkType(Object o){
        String str = o.getClass().getName();
        switch(str){
            case "Java.lang.String":
                System.out.println("String");
                break;  
            case "Java.lang.Integer":
                System.out.println("Integer");
                break;
            case "Java.lang.Character":
                System.out.println("Char");
                break;
            case "Main":
                System.out.println("Main");
                break;
            default :
                System.out.println("Something else:" + str);
                break;
        }
    }

}
_

注>単にpublic static boolean checkType(Object o)に変更してから、デフォルトではない各caseで_return true_に変更します。

2
Mansueli

あなたがしたいことが次のような場合:

class XXX implements InterfaceX {
    @Override
    public void methedX() { }
}

interface InterfaceX {
    void methedX();
}
List<XXX> x = new ArrayList<>();

if(x instanceOf List<InterfaceX>) {
    data.get(0).methedX();
}

次のようなテンプレートを使用してみてください。

class TypeHelper <T extends InterfaceX> {
    List<T> data;
    TypeHelper (List<T> data) {
        this.data = data;
    }

    public void func() {
        data.get(0).methedX();
    }
}

TypeHelper helper = new TypeHelper<XXX>(x);
helper.func();
0
崔乐天