web-dev-qa-db-fra.com

Vérifier si un objet est une instance de Liste du nom de classe donné

Étant donné un Object o et un String className = "org.foo.Foo", je veux vérifier si o est une instance de List<className>

J'ai essayé mais je ne compilerai pas:

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

Veuillez noter que mes entrées sont Object o et String className (veuillez faire attention aux types).

11
lviggiani

Ok, j'ai trouvé une méthode ... c'est un code un peu sale mais ça marche:

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
}
5
lviggiani

Je pense que vous pouvez le faire en deux étapes: D'abord, vous vérifiez que c'est une liste.

if (o instanceof List)

Ensuite, vous vérifiez que l'un (chaque?) Membre de la liste a le type donné.

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

C'est à cause de Type Erasure . La déclaration

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

sera exécuté à l'exécution, lorsque le type générique de la liste sera effacé. Par conséquent, il est inutile de vérifier instanceof générique-type.

8
Konstantin Yovkov

Solution que j'ai utilisée dans mon projet.

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

}

Note> changez simplement pour public static boolean checkType(Object o) puis return true dans chaque case qui n'est pas par défaut.

1
Mansueli

si ce que vous voulez faire est comme ça:

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

vous pouvez essayer d'utiliser un modèle comme:

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
崔乐天