У меня возникла странная ошибка компилятора при использовании генериков в цикле for-each в Java. Является ли это ошибкой компилятора Java, или я действительно что-то пропустил?Почему компилятор Java жалуется на использование foreach с сырым типом?
Вот весь мой класс:
public class Generics<T extends Object> {
public Generics(T myObject){
// I didn't really need myObject
}
public List<String> getList(){
List<String> list = new ArrayList<String>();
list.add("w00t StackOverflow");
return list;
}
public static void main(String...a){
Generics generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
}
Компилятор жалуется на линии с для-каждого: «Несоответствие типа не может преобразовать из типа элемента объекта в строку.»
Если бы я сделать это тонкое изменение, оно составляет:
public static void main(String...a){
Generics<?> generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
Я знаю, что getList()
делает использование дженериков, но он использует их в том, что я думал, что был совершенно не связан способом. Я мог это понять, если бы пытался перебрать что-то типа T и getList()
вернул List<T>
или что-то в этом роде, но здесь это не так. Тип возврата getList()
не должен иметь абсолютно никакого отношения к T, и не должно волновать, использую ли я тип raw для моего объекта Generics или нет ... правильно? Разве это не должно быть совершенно несвязанным, или я действительно чего-то здесь не вижу?
Обратите внимание, что код также компилируется, если я это делаю, что я думал, что должно было быть эквивалентно первому, а также:
public static void main(String...a){
Generics generics = new Generics(new Object());
List<String> list = generics.getList();
for(String s : list){
System.out.println(s);
}
}
'' ничем не отличается от '' . Вы не делаете родовую версию своего класса, вы делаете необработанный тип. Что подводит нас к вопросу о том, почему ваш класс является общим в первую очередь? Единственное место, где вы используете T, находится в конструкторе, и вы не используете эту ссылку. –
unholysampler
Я использовал '', потому что мне просто нужно что-то для примера. Настоящий код, очевидно, является чем-то другим, и он использует T ... он просто использует T полностью не связанным с 'getList()'. –
, не связанный с вашим вопросом, но я бы сделал конструктором Generics cls), так что вам не нужно создавать экземпляр объекта типа T только для создания этого класса Generics. –
MeBigFatGuy