2012-04-20 18 views
11

Questa è probabilmente una domanda molto noobish, ma stavo giocando un po 'con l'interazione Scala/Java, e mi chiedevo quanto bene suonasse Tuples.Inferenza tipo Tuple Scala in Java

Ora, so che la sintassi (Type1, Type2) è lo zucchero meramente sintattico per Tuple2<Type1, Type2>, e così, quando si chiama un metodo Scala che restituisce un Tuple2 in una classe Java semplice, mi aspettavo di ottenere un tipo di ritorno di Tuple2<Type1, Type2>

Per chiarezza, il mio codice Scala: codice

def testTuple:(Int,Int) = (0,1) 

Java:

Tuple2<Object,Object> objectObjectTuple2 = Test.testTuple(); 

sembra che il compilatore si aspetta Thi s di tipi parametrizzati <Object,Object>, anziché, nel mio caso, <Integer,Integer> (questo è quello che mi aspettavo, almeno).

Il mio pensiero è profondamente errato e c'è una spiegazione perfettamente ragionevole per questo?

O

C'è un problema nel mio codice Scala, e c'è un modo di essere più ... esplicita, nei casi che conosco fornirà un'API per il codice Java?

O

Questa è semplicemente una limitazione?

risposta

9

Int è il tipo intero di Scala, che è is a value class, quindi ottiene un trattamento speciale. È diverso da java.lang.Integer. È possibile specificare nello specifico java.lang.Integer se è ciò di cui si ha bisogno.

[[email protected] scala]$ cat SomeClass.scala 
class SomeClass { 
    def testIntTuple: (Int, Int) = (0, 1) 
    def testIntegerTuple: (java.lang.Integer, java.lang.Integer) = (0, 1) 
} 

[[email protected] scala]$ javap SomeClass 
Compiled from "SomeClass.scala" 
public class SomeClass implements scala.ScalaObject { 
    public scala.Tuple2<java.lang.Object, java.lang.Object> testIntTuple(); 
    public scala.Tuple2<java.lang.Integer, java.lang.Integer> testIntegerTuple(); 
    public SomeClass(); 
} 
+0

Quindi, 'Int' non è una normale classe di Scala? (Se lo fosse, la versione 'Int' dovrebbe essere stata compilata in' scalaTuple2 'o qualcosa di simile, no?) – aioobe

+1

Corretto. Da [gli scaladoc] (http://www.scala-lang.org/api/current/scala/Int.html): "' Int' è un membro delle classi di valore, quelle le cui istanze non sono rappresentate come oggetti da il sistema host sottostante. " La [pagina che descrive i tipi unificati] (http://docs.scala-lang.org/tutorials/tour/unified_types.html) potrebbe spiegarlo meglio. – leedm777

+0

Ottima risposta @dave, grazie, che ha perfettamente senso dal momento che Int non può essere tradotto magicamente in una classe Java, presumevo che sarebbe stato tradotto in Integer. – pcalcao