Подтвердить что ты не робот

Как экземпляр List <MyType>?

Как я могу заставить эту работу работать? Я могу проверить, если (obj instanceof List<?>), но не если (obj instanceof List<MyType>). Есть ли способ сделать это?

4b9b3361

Ответ 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
}

Ответ 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);
    }
}