Как я могу заставить эту работу работать? Я могу проверить, если (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);
}
}