Perché il compilatore Java si lamenta di usare Foreach con un tipo grezzo? [duplicare
Domanda
Ho ricevuto uno strano errore del compilatore quando ho usato i generici all'interno di un ciclo per Java. È un bug del compilatore Java o mi manca davvero qualcosa qui?
Ecco tutta la mia classe:
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);
}
}
}
Il compilatore si lamenta della linea con la per l'eact: "Il tipo di mancata corrispondenza non può convertire dall'oggetto tipo elemento in stringa".
Se apro questa sottile modifica, compila:
public static void main(String...a){
Generics<?> generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
lo so getList()
Usa i generici, ma li usa in quello che pensavo fosse un modo completamente non correlato. Potrei capirlo se stavo cercando di iterare su qualcosa di tipo T e getList()
restituito a List<T>
O qualcosa del genere, ma non è così. Il tipo di ritorno di getList()
Non dovrebbe avere assolutamente nulla a che fare con T e non dovrei preoccuparmi se uso il tipo grezzo per il mio oggetto generico o no ... giusto? Non dovrebbero essere completamente non correlati o mi manca davvero qualcosa qui?
Si noti che il codice si compila anche se lo faccio, che pensavo avrebbe dovuto essere equivalente anche al primo:
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);
}
}
Nessuna soluzione corretta