A NullReferenceException
бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.
Например:
string str = string.Empty;
str.ToLower(); // throw null reference exception
Public Class Person {
public string Name { get; set; }
}
Person objPerson;
objPerson.Name /// throw Null refernce Exception
Это невозможно, потому что стирание типа данных во время компиляции генериков. Только возможный способ сделать это - написать какую-то оболочку, которая содержит тип, который имеет список:
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;
}
}
Вероятно, вам нужно использовать отражение, чтобы проверить их типы. Чтобы получить тип списка: Получить общий тип java.util.List
Это можно использовать, если вы хотите проверить, что 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.
}
}
Вы можете использовать поддельную фабрику для включения многих методов вместо использования 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);
}
}
Если вы проверяете, является ли ссылка объекта 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());
if(!myList.isEmpty() && myList.get(0) instanceof MyType){
// MyType object
}
Если это не может быть обернуто дженериками (ответ @ 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 );
}
}