2013-04-25 25 views
6

Continuo a ricevere l'errore "L'operatore% non è definito per il tipo argomento (s) Intero, intero" Non sono del tutto sicuro del motivo per cui questo sta accadendo. Ho pensato che dal momento che la divisione modulare non può restituire decimali che avere valori interi andrebbe bene.Divisione Mod di due interi

Questo sta accadendo all'interno di un metodo in un programma che sto creando. Il codice è il seguente:

public void addToTable(Integer key, String value) 
{ 
    Entry<Integer, String> node = new Entry<Integer, String>(key, value); 
    if(table[key % tableSize] == null) 
     table[key % tableSize] = node; 
} 

Il metodo è finito ma l'errore si verifica

if(table[key % tableSize] == null) 

e

table[key % tableSize] = node; 

aiuto o suggerimento sarebbe apprezzato.

+1

Quale versione di Java stai usando? – durron597

+0

Il sospetto @ durron597 è corretto e stai usando <1.5, quindi vai con le risposte qui sotto. – earcam

+0

In Java 1.5 e 1.6, posso ottenere Intero% intero intero da compilare correttamente. – rgettman

risposta

7

È possibile ottenere codice di esempio Integer % Integer per compilare correttamente in Java 1.5 e 1.6, ma non in 1.4.

public static void main(String[] args) 
{ 
    Integer x = 10; 
    Integer y = 3; 
    System.out.println(x % y); 
} 

Questo è l'errore in 1.4:

ModTest.java:7: operator % cannot be applied to java.lang.Integer,java.lang.Integer 
     System.out.println(x % y); 
          ^

La spiegazione più ragionevole è che a causa Java introduced autoboxing and autounboxing in 1.5, è necessario utilizzare un compilatore Java da prima 1.5, per esempio, 1.4.

Solutions:

  • l'aggiornamento a Java 1.5/1.6/1.7.
  • Se è necessario utilizzare 1.4, utilizzare Integer.intValue() per estrarre i valori , su cui è possibile utilizzare l'operatore %.
+0

molto apprezzato @rgettman – user2268305

0

Provare a convertire i numeri interi in pollici, quindi eseguire %.

2

Questo funziona per me.

Integer x = Integer.valueOf(10); 
Integer y = Integer.valueOf(3); 

int z = x % y; 

System.out.println(z); 

Nessun problema. Uscita:

1 

Che errore si ottiene? Quale versione di Java stai usando? Sembra che tu stia usando Java sotto 1.5.

1

Quello che stai tentando qui è chiamato unboxing, l'auto-conversione di un oggetto in un tipo primitivo (andando nell'altro modo è autoboxing).

documenti Il Java hanno a dire:


Il compilatore Java applica unboxing quando un oggetto di una classe involucro è:

  • passato come parametro a un metodo che prevede un valore del corrispondente tipo primitivo.
  • Assegnato a una variabile del tipo primitivo corrispondente.

Quindi Una possibilità è che sei non fare una di quelle cose e, anche se sembra a prima vista che si sta passando né la tua espressione mod a un metodo, né assegnarlo a un variabile, è valida, almeno in Java 6:

class Test { 
    public static void main(String args[]) { 
     Integer x = 17; 
     Integer y = 5; 
     System.out.println (x % y); 
     String [] z = new String[10]; 
     z[x % y] = "hello"; 
    } 
} 

L'altra possibilità è che si sta utilizzando un pre ambiente Java 5, in cui è stato introdotto autoboxing e unboxing.

La scelta migliore in questo caso è probabilmente quella esplicita e utilizzare Integer.intValue() per ottenere il sottostante int.

Tuttavia si potrebbe anche voler considerare l'utilizzo di un int (non Integer) per la chiave e solo la boxe fino al punto in cui si necessità a (quando lo si aggiunge a un Entry). Potrebbe essere più veloce usare il tipo primitivo, anche se ovviamente dovresti fare un benchmark per essere sicuro.