Как я могу заставить эту работу работать? Я могу проверить, если (obj instanceof List<?>), но не если (obj instanceof List<MyType>). Есть ли способ сделать это?
Как экземпляр List <MyType>?
Ответ 1
Это невозможно, потому что стирание типа данных во время компиляции генериков. Только возможный способ сделать это - написать какую-то оболочку, которая содержит тип, который имеет список:
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;
     }
}
		Ответ 2
if(!myList.isEmpty() && myList.get(0) instanceof MyType){
    // MyType object
}
		Ответ 3
Вероятно, вам нужно использовать рефлексию, чтобы проверить их типы. Чтобы получить тип списка: Получить общий тип java.util.List
Ответ 4
Если вы проверяете, является ли ссылка объекта List или Map объекта экземпляром коллекции, просто создайте экземпляр требуемого списка и получите его класс...
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());
		Ответ 5
Если это невозможно обернуть с помощью генериков (ответ @Martijn), лучше передать его без каста, чтобы избежать избыточной итерации списка (проверка первого типа элемента ничего не гарантирует). Мы можем использовать каждый элемент в фрагменте кода, где мы перебираем список.
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 );
    }
}
		Ответ 6
Вы можете использовать поддельный factory для включения многих методов вместо использования 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);
    }
}