web-dev-qa-db-fra.com

comment instanceof List <MyType>?

Comment puis-je obtenir ce genre de chose au travail? Je peux vérifier si (obj instanceof List<?>) mais pas si (obj instanceof List<MyType>). Y a-t-il un moyen de faire cela?

72
Triton Man

Cela n’est pas possible car le type de données est effacé au moment de la compilation des génériques. Le seul moyen de le faire est d’écrire un type d’emballage qui contient le type de la liste:

public class GenericList <T> extends ArrayList<T>
{
     private Class<T> genericType;

     public GenericList(Class<T> c)
     {
          this.genericType = c;
     }

     public Class<T> getGenericType()
     {
          return genericType;
     }
}
44
Martijn Courteaux
if(!myList.isEmpty() && myList.get(0) instanceof MyType){
    // MyType object
}
23
Sathish

Vous devrez probablement utiliser la réflexion pour vérifier leur type. Pour obtenir le type de la liste: Obtenir le type générique de Java.util.List

8
evanwong

Ceci peut être utilisé si vous voulez vérifier que object est une instance de List<T>, qui n'est pas vide:

if(object instanceof List){
    if(((List)object).size()>0 && (((List)object).get(0) instanceof MyObject)){
        // The object is of List<MyObject> and is not empty. Do something with it.
    }
}
4
Ivo Stoyanov

Si vous vérifiez si une référence d'une valeur List ou Map of Object est une instance d'une Collection, créez simplement une instance de la liste Requise et obtenez sa classe ...

Set<Object> setOfIntegers = new HashSet(Arrays.asList(2, 4, 5));
assetThat(setOfIntegers).instanceOf(new ArrayList<Integer>().getClass());

Set<Object> setOfStrings = new HashSet(Arrays.asList("my", "name", "is"));
assetThat(setOfStrings).instanceOf(new ArrayList<String>().getClass());
1
Marcello de Sales

Vous pouvez utiliser une fausse usine pour inclure de nombreuses méthodes au lieu d’utiliser instanceof:

public class Message1 implements YourInterface {
   List<YourObject1> list;
   Message1(List<YourObject1> l) {
       list = l;
   }
}

public class Message2 implements YourInterface {
   List<YourObject2> list;
   Message2(List<YourObject2> l) {
       list = l;
   }
}

public class FactoryMessage {
    public static List<YourInterface> getMessage(List<YourObject1> list) {
        return (List<YourInterface>) new Message1(list);
    }
    public static List<YourInterface> getMessage(List<YourObject2> list) {
        return (List<YourInterface>) new Message2(list);
    }
}
0
LeLe

Si cela ne peut pas être emballé avec des génériques (réponse de Martijn), il est préférable de le passer sans casting pour éviter une itération de liste redondante (vérifier le type du premier élément ne garantit rien). Nous pouvons convertir chaque élément dans la partie de code où nous itérons la liste.

Object attVal = jsonMap.get("attName");
List<Object> ls = new ArrayList<>();
if (attVal instanceof List) {
    ls.addAll((List) attVal);
} else {
    ls.add(attVal);
}

// far, far away ;)
for (Object item : ls) {
    if (item instanceof String) {
        System.out.println(item);
    } else {
        throw new RuntimeException("Wrong class ("+item .getClass()+") of "+item );
    }
}
0
wildloop