Domanda Perché è necessario convertire da Integer a int [chiuso]


Ho riscontrato un problema quando utilizzo TreeMap.

    Map<Integer, Integer> a = new TreeMap<Integer, Integer>();
    a.put(5,1);
    a.put(3,2);
    a.put(4,3);
    int target = 7;
    System.out.println(target - a.get(5)); //line 6
    for(Map.Entry b : a.entrySet()){
        System.out.println(target - b.getValue()); //line 8
    }

Il codice sopra mi ha dato un errore di compilazione. Tuttavia, quando cambio la linea 8 in questo modo:

    Map<Integer, Integer> a = new TreeMap<Integer, Integer>();
    a.put(5,1);
    a.put(3,2);
    a.put(4,3);
    int target = 7;
    System.out.println(target - a.get(5)); //line 6
    for(Map.Entry b : a.entrySet()){
        System.out.println(target - (int) b.getValue()); //line 8
    }

Quindi funziona. Qualcuno potrebbe darmi qualche idea del perché non ho bisogno di alcun cambiamento nella riga 6, ma ho bisogno di convertire un intero in int nella riga 8?


22
2018-02-24 07:37


origine


risposte:


Hai ignorato l'avviso di "tipo non elaborato" in for dichiarazione. Dovrebbe essere:

    for(Map.Entry<Integer,Integer> b : a.entrySet()) {
        ...

Il tipo grezzo causerebbe getValue() ritornare Object. Se fornite i parametri di tipo, il compilatore sa che ritornerà Integere questo verrà automaticamente rimosso.


43
2018-02-24 07:41



Ci sono più operazioni sotto (int) b.getValue(). Primo getValue() ritorna Object e quindi a cui è assegnato Integer che è quindi unboxed a int . a.get() nel suo proprio ritorna immediatamente Integer dal momento che hai dichiarato un con Intero in <> (vedi https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#get(java.lang.Object) restituisce il tipo V).

Il target - b.getValue() non ha compilato perché lo era int - Object operazione che non è definita per l'operatore - . Questo è il motivo per cui devi fare il cast (int) .

In seguito non funzionerà anche se b si riferisce all'oggetto che è Integer.

Integer a = 1;
Object  b = a;
System.out.println(3 - b); // compile time error "bad operand types for binary operator '-'"

Seguendo lavori

Integer a = 1;
Object  b = a;
System.out.println(3 - a);

Funziona anche

Integer a = 1;
Object  b = a;
System.out.println(3 - (int) b); //this is when you say to compiler not to worry since you are sure that object reference refers to the object that is Integer.

Sebbene se in runtime b non si riferisca a int il cast fallirà. Anche se è stato compilato in primo luogo.

Integer a = 1;
String  s = "shouldn't work at runtime";
Object  b = s;
System.out.println(3 - (int) b); //this  will compile but fail at runtime

5
2018-02-24 07:52