Оператор Java Diamond в параметре метода не проверяет тип объектов в коллекции, полученных в качестве аргумента от вызывающего метода

Сценарий: метод addList в классе ожидает List из Integer объекты.
main метод отправляет ArrayList аргумент, содержащий объекты нескольких типов, а не только Integer,

Результат: вызов метода addList успешно, и также можно получить объекты, хранящиеся в ArrayList и распечатать их.

Вопрос: не следует ли ожидать, что во время выполнения, когда список получен в вызываемом методе, его содержимое будет проверено, и это приведет к некоторому исключению?

Однако в addList метод, если я пытаюсь вставить неInteger объект в ArrayList, он терпит неудачу только во время компиляции.

Делает ли это вывод о том, что ограничение оператора Diamond действует только при вставке объектов в коллекцию?

Обратите внимание, что erasure-in-generics - это другой вопрос, и он не дает ответа на этот вопрос.

package com.rnd.nirav;

import java.util.ArrayList;
import java.util.List;

public class OverRidingTest {

public static void main(String[] args) {

    List list = new ArrayList<>();
    list.add(Integer.valueOf(1));
    list.add("Nirav");
    list.add(Float.valueOf(1.1f));

    addList(list);

}

public static void addList(List<Integer> list) {
    list.add("Khandhedia"); // This fails as expected.
    System.out.println("List size = " + list.size());
    Iterator itr = list.iterator();
    while(itr.hasNext())
    {
        System.out.println("Element is " + itr.next());
    }
}

}

2 ответа

Я рекомендую вам быстро пройти курс обучения Oracle. В основном Generics - это подсказка для компилятора и ничего более. Они оцениваются во время компиляции.

Хорошо, если вы говорите об этом алмазном операторе, это называется generics

Обобщения оцениваются во время компиляции, а не во время выполнения

почему дженерики??

единственная причина в том, что генерики обеспечивают безопасность типов, рассмотрите следующий пример

public static void addContent() {
        List<Integer> list = new LinkedList<>();
        for (int i = 0; i < 10; i++) {
            list.add(new Integer(i));
        }

    }

Почему мы на самом деле нужны generics??

Так что наш контент не может быть видоизменен, как вы не хотите добавлять или смешивать salt to sugar и здесь вы не можете добавить какой-либо другой тип объекта и, таким образом, его легко получить и обработать (например, легко получить доступ к одному типу объектов). например.

for (Integer i : list) {
            System.out.println(i);
        } 

Что делает этот ромбовидный оператор?

Это обеспечивает безопасность типов во время компиляции, как помогает остановить время adding salt to sugar лайк

list.add("hello"); //not possible

Почему это не поддерживает int, float, char а только класс обёртка?

Потому что Java вращается только вокруг объектов, и мы все знаем, int,float and char типы не имеют объекта

еще одна вещь, которую вы заметите <? extends/super SomeType>,что это такое

Его простое наследование и полиморфизм.

Почему ваш код не проверяет один конкретный тип

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

Редактировать 1: Ваш код не сбоит, он работает отлично

Редактировать:

Какие ? представляет собой?? ? представляет класс объекта при использовании в качестве Type<?> означает, что вы не можете ничего добавить, кроме objects из Object class только.

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