Java generics: экземпляр экземпляра [duplicate]

A NullReferenceException бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.

Например:

  1. При использовании метода string пустой строки:
    string str = string.Empty;
    str.ToLower(); // throw null reference exception
    
  2. Когда свойство нулевого объекта доступно:
    Public Class Person {
        public string Name { get; set; }
    }
    Person objPerson;
    objPerson.Name  /// throw Null refernce Exception 
    
59
задан Paul Bellora 11 April 2012 в 15:40
поделиться

7 ответов

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

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;
     }
}
38
ответ дан Martijn Courteaux 23 August 2018 в 21:16
поделиться

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

8
ответ дан Community 23 August 2018 в 21:16
поделиться

Это можно использовать, если вы хотите проверить, что 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.
    }
}
2
ответ дан Ivo Stoyanov 23 August 2018 в 21:16
поделиться

Вы можете использовать поддельную фабрику для включения многих методов вместо использования 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);
    }
}
0
ответ дан jrtapsell 23 August 2018 в 21:16
поделиться

Если вы проверяете, является ли ссылка объекта 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());
0
ответ дан Marcello de Sales 23 August 2018 в 21:16
поделиться
if(!myList.isEmpty() && myList.get(0) instanceof MyType){
    // MyType object
}
19
ответ дан Sathish 23 August 2018 в 21:16
поделиться

Если это не может быть обернуто дженериками (ответ @ 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 );
    }
}
0
ответ дан wildloop 23 August 2018 в 21:16
поделиться
Другие вопросы по тегам:

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