2012-04-20 29 views
11

Probablemente esta sea una pregunta muy novata, pero estaba jugando un poco con la interacción Scala/Java, y me preguntaba qué tan bien jugaron las Tuplas.Inferencia de tipo Scala Tuple en Java

Ahora, sé que la sintaxis (Type1, Type2) es el azúcar meramente sintáctica para Tuple2<Type1, Type2>, y así, cuando se llama a un método Scala que devuelve un Tuple2 en una clase Java normal, esperaba conseguir un tipo de retorno de Tuple2<Type1, Type2>

Para mayor claridad, mi código Scala: código

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

Java:

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

parece que el compilador espera Thi s de tipos parametrizados <Object,Object>, en lugar de, en mi caso, <Integer,Integer> (esto es lo que esperaba, al menos).

¿Es mi pensamiento profundamente defectuoso y hay una explicación perfectamente razonable para esto?

O

¿Hay algún problema en mi código Scala, y hay una manera de ser más explícita ..., en los casos que sé que van a proporcionar una API para código Java?

O

¿Es esto simplemente una limitación?

Respuesta

9

Int es el tipo entero de Scala, que is a value class, por lo que recibe un tratamiento especial. Es diferente de java.lang.Integer. Puede especificar java.lang.Integer específicamente si eso es lo que necesita.

[[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

Entonces, 'Int' no es una clase ordinaria de Scala? (Si fuera así, la versión 'Int' debería haberse compilado en' scalaTuple2 'o algo similar, ¿no?) – aioobe

+1

Correcto. De [los scaladocs] (http://www.scala-lang.org/api/current/scala/Int.html): "' Int' es un miembro de las clases de valores, aquellos cuyas instancias no están representadas como objetos por el sistema host subyacente ". La [página que describe los tipos unificados] (http://docs.scala-lang.org/tutorials/tour/unified_types.html) puede explicarlo mejor. – leedm777

+0

Excelente respuesta @dave, gracias, tiene mucho sentido ya que Int no se puede traducir mágicamente a una clase de Java, supongo que se traducirá a Entero. – pcalcao

Cuestiones relacionadas