Какова цель List<?>, Если можно вставить только нулевое значение?
На основании информации, представленной в ссылке, говорится, что:
Важно отметить, что
List<Object>
а такжеList<?>
не то же самое. Вы можете вставить объект или любой подтип объекта вList<Object>
, Но вы можете вставить только ноль вList<?>
,
Какая польза от использования List<?>
когда только null
можно вставить?
Например,
methodOne(ArrayList<?> l):
Мы можем использовать этот метод для ArrayList
любого типа, но внутри метода мы ничего не можем добавить в список, кроме null
,
l.add(null);//(valid)
l.add("A");//(invalid)
3 ответа
Вы используете неограниченные подстановочные знаки, когда список (или коллекция) имеет неизвестные типы.
Как говорится в учебнике, он используется, когда вы хотите получить информацию о каком-либо списке, например, распечатать его содержимое, но вы не знаете, какой тип он может содержать:
public static void printList(List<?> list) {
for (Object elem: list)
System.out.print(elem + " ");
System.out.println();
}
Вы не должны использовать его, когда хотите вставить значения в список, так как единственное допустимое значение null
, потому что вы не знаете, какие значения он содержит..
Вы можете получить элементы из вашего списка.
List<?>
обычно используется как тип для списка объектов неизвестного типа, возвращаемых методом или около того, откуда вы читаете элементы, а не добавляете их.
совсем другое. Если мы попытаемся добавить объекты в, даже если объект имеет тип
Object
, мы не можем этого сделать. Он говорит:
add(capture<?>)
вjava.util.List
не может применяться к(java.lang.Object)
Теперь это может показаться немного ограничительным. Если вы не можете передавать какие-либо значения в качестве параметров, что я имею в виду, когда говорю «поместить в список», то что вы можете с этим сделать?
Что ж, давайте разберемся, почему существует такое ограничение. Для начала мы знаем, что массивы ковариантны. Это означает, что мы можем взять массив строк и поместить его в массив объектов.
Итак, если мы возьмем этот первый объект и назначим его случайной String, все будет хорошо. И если мы назначим его новому объекту, если мы добавим его, мы получим исключение ArrayStoreException
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Object
из-за небезопасности ковариантных массивов.
Что ж, в случае того, что компилятор Java пытается сделать для нас, запрещая нам добавлять значения в или
List<? extends Object>
ставит нас в положение, когда этот тип можно использовать только безопасно. Фактически, единственная ценность, которую вы можете вложить в
List<?>
это значение, потому что
null
может быть принужден к любому типу.