Я изучаю дженерики на 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
Почему несоответствие типов компилируется и работает с дженериками и итераторами Java? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему этот метод с циклическими дженериками в сигнатуре не компилируется?
Anonymous » » в форуме JAVA - 0 Ответы
- 32 Просмотры
-
Последнее сообщение Anonymous
-