Почему несоответствие типов компилируется и работает с дженериками и итераторами Java?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему несоответствие типов компилируется и работает с дженериками и итераторами Java?

Сообщение Anonymous »

Я изучаю дженерики на Java и попал в удивительную ситуацию. Я создал приведенный ниже код специально для генерации ошибки, но вместо этого получаю только предупреждения, и что еще более удивительно, так это тот факт, что если мы игнорируем предупреждения, это работает.
import java.util.ArrayList;
import java.util.Iterator;

class Test {
static public void main(String[] args) {
ArrayList list = new ArrayList();
for (int i = 0; i < 10; i++) {
list.add(i);
}

ArrayList list2 = new ArrayList();
for (int i = 0; i < 10; i++) {
list2.add("Bonjour");
}

Printer printer = new Printer();
printer.Print(list2);
}
}

и
import java.util.Iterator;
import java.util.Collection;

public class Printer {

public void Print(E data) {
Iterator i = data.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
}
}

В классе Printer я решил не использовать параметр типа для итерируемого типа E. Из этого вопроса система предполагает, что аргумент типа является объектом. Справедливо. Итак, я ожидаю ArrayList объектов.
В функции Print этого класса я создаю итератор для типа T, так что это более специфично, чем Object.
Я ожидал, что если бы я, например, передал ArrayList строк функции Print и создал итератор целых чисел, произошла бы ошибка, потому что я не могу просто привести строку к целому числу просто так. Но нет, на самом деле он компилируется и работает нормально. Вывод следующий:
Printer.java:7: warning: [unchecked] unchecked conversion
Iterator i = data.iterator();
^
required: Iterator
found: Iterator
where T is a type-variable:
T extends Object declared in class Printer
1 warning
Printer.java:7: warning: [unchecked] unchecked conversion
Iterator i = data.iterator();
^
required: Iterator
found: Iterator
where T is a type-variable:
T extends Object declared in class Printer
1 warning
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour
Bonjour

Почему это вообще компилируется? И как это работает?
Изменить:
Я пытался добавить эту строку в main:
Iterator it = list2.iterator();

И выдает ошибку, компиляция не удалась, чего я и ожидал. Почему исходный код компилируется, хотя в этой строке происходит то же самое:
Iterator i = data.iterator();


Подробнее здесь: https://stackoverflow.com/questions/792 ... -iterators
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»