2009-08-12 4 views
45

Stavo lavorando con una variabile che avevo dichiarato come numero intero e ho scoperto che> non è un membro di Integer. Ecco un semplice esempio:Quali sono le differenze tra Int e Integer in Scala?

scala> i 
warning: there were deprecation warnings; re-run with -deprecation for details 
res28: Integer = 3 

scala> i > 3 
<console>:6: error: value > is not a member of Integer 
     i > 3 
     ^

Confronti che, per un int:

scala> j 
res30: Int = 3 

scala> j > 3 
res31: Boolean = false 

Quali sono le differenze tra interi e Int? Vedo l'avviso di ritiro ma non mi è chiaro perché è stato deprecato e, dato che è stato, perché non ha un> metodo.

+0

Grazie, tutto, per le risposte utili. Tutti rispondete alla mia domanda, quindi lascerò che la risposta più alta salga in alto e la contrassegnerò come risposta. Nel frattempo, ho valutato tutte le tue risposte. – pr1001

risposta

40

"Quali sono le differenze tra Integer e Int?"

Integer è solo un alias per java.lang.Integer. Int è il numero intero di Scala con le capacità extra.

Guardando in Predef.scala si può vedere questo l'alias:

/** @deprecated use <code>java.lang.Integer</code> instead */ 
    @deprecated type Integer = java.lang.Integer 

Tuttavia, v'è una conversione implicita da int a java.lang.Integer se ne avete bisogno, il che significa che è possibile utilizzare in Int metodi che prendono un intero.

Sul motivo per cui è deprecato, posso solo presumere che fosse per evitare qualsiasi confusione su quale tipo di intero con cui stavi lavorando.

3

Il numero intero viene importato da java.lang.Integer ed è compatibile solo con Java. Dal momento che è una classe Java, ovviamente non può avere un metodo chiamato "<". MODIFICA: è possibile attenuare questo problema dichiarando una conversione implicita da Intero a Int.

implicit def toInt(in:Integer) = in.intValue() 

Tuttavia, riceverai comunque un avviso di deprecazione.

4

Penso che il problema che si sta vedendo ha a che fare boxing/unboxing di tipi di valore e l'uso della classe Java Integer.

Penso che la risposta sia qui: Boxing and unboxing in Scala. Non esiste un unboxing implicito in Scala. Hai definito i come la classe Java Integer ma nello i> 3, il 3 viene trattato e un int.

+0

il link è rotto ora. – 203

1

Integer è una classe Java, java.lang.Integer. È diverso dal tipo primitivo di Java int, che non è una classe. Non è possibile definire < perché Java non consente la definizione degli operatori per le classi.

Ora, potreste chiedervi perché esiste un tipo simile? Bene, i tipi primitivi non possono essere passati come riferimenti, quindi non è possibile passare un int a un metodo che si aspetta AnyRef, equivalente a Scala AnyRef, ad esempio. Per fare ciò, inserisci quello int all'interno di un oggetto Integer e quindi passa lo Integer.

1

Il numero intero viene importato da java.lang.Integer ed è compatibile solo con Java. Dal momento che è una classe Java, ovviamente non può avere un metodo chiamato "<".

MODIFICA: è possibile attenuare questo problema dichiarando una conversione implicita da Intero a Int.