Я изучаю дженерики на 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
Программисты JAVA общаются здесь
1733429169
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();
Подробнее здесь: [url]https://stackoverflow.com/questions/79255996/why-a-type-mismatch-compiles-and-works-with-java-generics-and-iterators[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия