Проверьте, является ли объект экземпляром списка заданного имени класса

Учитывая Object o и a String className = "org.foo.Foo", я хочу проверить, является ли o экземпляром List<className>

Я пробовал это, но не компилирую:

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

Обратите внимание, что мои входы Object o и String className (пожалуйста, учитывайте типы).

Ответ 1

Хорошо, я нашел метод... это немного грязный код, но он работает:

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
}

Ответ 2

Это из-за Тип Erasure. Утверждение

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

будет выполняться во время выполнения, когда общий тип списка будет удален. Поэтому нет никакой точки проверки для instanceof generic-type.

Ответ 3

Я думаю, вы можете сделать это в два этапа: Сначала вы проверяете список.

if (o instanceof List)

Затем вы проверяете, что один (каждый?) член списка имеет заданный тип.

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

Ответ 4

Решение, которое я использовал в своем проекте.

/**
 * 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;
}

Ответ 5

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), а затем return true в каждом case, который не является значением по умолчанию.

Ответ 6

если вы хотите сделать это:

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();

Ответ 7

Простой способ. Может быть, это поможет, конечно, не точный ответ, но это еще один способ получить результат.

if (data != null && data.get(0) instanceof Cls) {}