Вопрос по generics, java – как сделать экземпляр List <MyType>?

67

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

возможный дубликатCannot perform instanceof check against parameterized type ArrayList<Foo> Paul Bellora
Увидетьdocs.oracle.com/javase/tutorial/java/generics/erasure.html Paul Bellora

Ваш Ответ

7   ответов
22
if(!myList.isEmpty() && myList.get(0) instanceof MyType){
    // MyType object
}
ГдеmyList объявили?
@ AdamGawne-Cain. Это небезопасно, но, к сожалению, единственное решение для людей, не знающих много о списке. Например - у меня есть локальная переменнаяvalue который возвращаетсяObjectи мне нужно проверить - если это список, если он есть, проверить, является ли тип списка экземпляром моего интерфейса. Никакая обертка или параметризованный тип здесь не полезны.
Yeap. Это единственный вариант, доступный для пустого списка.stackoverflow.com/questions/1942644/…
... а для пустого списка? Размышления?
Этот ответ небезопасен, потому что даже если элемент 0 является MyType, другие элементы могут быть других типов. Например, возможно, список был объявлен как ArrayList & lt; Object & gt ;, затем был добавлен MyType, а затем была добавлена строка.
0

лучше передать его без приведения, чтобы избежать избыточной итерации списка (проверка типа первого элемента ничего не гарантирует). Мы можем привести каждый элемент куска кода, где мы перебираем список.

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 );
    }
}
4

object это примерList<T>, который не пуст:

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.
    }
}
8

вероятно, нужно использовать отражение, чтобы получить их типы для проверки. Чтобы получить тип списка: Получить универсальный тип java.util.List

Насколько я знаю, это работает только для полей, но +1 за упоминание этого.
0

является ли ссылка на значение List или Map объекта Object экземпляром Collection, просто создайте экземпляр требуемого List и получите его класс ...

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());
Какой смысл твоегоsetOfIntegers а такжеsetOfStrings?
@DanielM только что обновил образец. Это должно быть использование этих ссылок! Спасибо!
42

потому что тип данных стирается во время компиляции генериков. Единственный возможный способ сделать это - написать какую-нибудь оболочку, которая содержит тип, содержащийся в списке:

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;
     }
}
Спасибо, я думаю, что просто передам универсальный тип в функцию, которую я вызываю, чтобы проверить и проверить оба элемента. Triton Man
хорошо, есть альтернативный способ проверить это? Triton Man
0

вместо использования 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);
    }
}

Похожие вопросы