Newsgroup: it.comp.java
Titolo: Qualche dubbio sui Warning dei Generics

ciao a tutti
sto studiando per l'scjp. arrivato ai generics e facendo qualche prova
con eclipse ho qualche dubbio sui warnings.
dal libro che sto usando (mcgraw hill) fa 2 esempi.
il primo:
----
import java.util.*;
public class TestLegacy {
   public static void main(String[] args) {
      List<Integer> myList = new ArrayList<Integer>();
      // type safe collection
      myList.add(4);
      myList.add(6);
      Adder adder = new Adder();
      int total = adder.addAll(myList);
     // pass it to an untyped argument
     System.out.println(total);
  }
}
import java.util.*;
class Adder {
  int addAll(List list) {
    // method with a non-generic List argument,
    // but assumes (with no guarantee) that it will be Integers
    Iterator it = list.iterator();
    int total = 0;
    while (it.hasNext()) {
       int i = ((Integer)it.next()).intValue();
       total += i;
    }
    return total;
}
--------
Si tratta di vedere quando del codice genera warnings se utilizzato
con classi pre java5.
Ora, sempre a quanto dice il libro, il codice non dovrebbe generare
warnings in quanto l'Adder non modifica la lista type safe che viene
passata.
Provo dunque con eclipse compilando l'Adder con java1.4 e TestLegacy
con java6 e di warnings sulla chiamata "int total =
adder.addAll(myList);" non se ne vedono... OK!
passo al secondo esempio:
--------
import java.util.*;
public class TestBadLegacy {
public static void main(String[] args) {
   List<Integer> myList = new ArrayList<Integer>();
   myList.add(4);
   myList.add(6);
   Inserter in = new Inserter();
   in.insert(myList); // pass List<Integer> to legacy code
}
}
class Inserter {
  // method with a non-generic List argument
  void insert(List list) {
     list.add(new Integer(42)); // adds to the incoming list
  }
}
--------
in questo caso a quanto ho capito "in.insert(myList);" dovrebbe dare
un warning. Allora come prima compilo Inserter con java1.4
TestBadLegacy con java6... ma nessun warning "unchecked or unsafe
operations" mi viene restituito!
ora volevo capire perchè non ottengo il warning e soprattutto se a
quanto ho capito questi sono generati solo nel momento in cui si
richiama codice legacy che modifica la lista e non sempre come
pensavo.
grazie 1000

 un warning.
Il warning viene generato quando passi un'istanza anonima ad un metodo
che invece vuole un'istanza "genericizzata", e non il contrario.
Se provi ad invocare il metodo:
void insert( List<Integer> list );
con:
insert( new ArrayList() );
allora vedrai il warning. Ma se fai l'inverso (come nei tuoi esempi)
no.
--
SoulSpirit

 che invece vuole un'istanza "genericizzata", e non il contrario.
grazie per la risposta.
in teoria è molto più utile un warning nel momento in cui si cerca di
passare una Lista creata con generics a un metodo di una vecchia
classe che non usa generics e che potrebbe inserirci qualunque cosa...
l'opzione "-Xlint:unchecked" nella ricompilazione permette infatti di
vedere dove la lista puo' essere corrotta dal metodo che non usa
generics
hanno bevuto questi della mc growHill?? .. non penso, sono anche gli
autori dell'esame
continuo a non capire quando effettivamente vengano generati
esattamente questi warnings..