Оператор 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
только.