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?
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;
}
}
if(!myList.isEmpty() && myList.get(0) instanceof MyType){
// MyType object
}
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
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.
}
}
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());
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);
}
}
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 );
}
}