Какова цель 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 может быть принужден к любому типу.

Другие вопросы по тегам