2012-04-20 16 views
11

Jest to prawdopodobnie bardzo nieobowiązkowe pytanie, ale grałem trochę z interakcją Scala/Java i zastanawiałem się, jak dobrze krotki grają.Wnioskowanie typu Scala Tuple w Javie

Teraz wiem, że składnia (Type1, Type2) jest cukier jedynie składniowym dla Tuple2<Type1, Type2>, a więc, gdy wywołanie metody Scala zwracającą Tuple2 w zwykły klasy Java, spodziewałem się dostać typ zwracanej Tuple2<Type1, Type2>

Dla jasności, mój kod Scala: Kod

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

Java:

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

wydaje kompilator spodziewa jes s to sparametryzowane typy <Object,Object>, zamiast, w moim przypadku, <Integer,Integer> (tego właśnie oczekiwałem, przynajmniej).

Czy moje myślenie jest głęboko błędne i czy istnieje całkowicie uzasadnione wytłumaczenie tego?

LUB

Czy jest jakiś problem w moim kodu Scala, a tam sposobem bycia bardziej ... wyraźny, w przypadkach, które znam dostarczy API dla kodu Java?

LUB

Czy to po prostu ograniczenie?

Odpowiedz

9

Int jest liczbą całkowitą Scala, która is a value class, więc dostaje specjalne traktowanie. Różni się od java.lang.Integer. Można określić konkretnie, jeśli to jest potrzebne, java.lang.Integer.

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

Więc "Int" nie jest zwykłą klasą Scala? (Jeśli tak, to wersja 'Int' powinna zostać skompilowana w' scalaTuple2 'lub coś podobnego, nie?) – aioobe

+1

Prawidłowo. Od [the scaladocs] (http://www.scala-lang.org/api/current/scala/Int.html): "' Int' jest członkiem klas wartości, których instancje nie są reprezentowane jako obiekty przez podstawowy system hosta. " Strona [opisująca typy zunifikowane] (http://docs.scala-lang.org/tutorials/tour/unified_types.html) może lepiej to wyjaśnić. – leedm777

+0

Świetna odpowiedź @dave, dziękuję, to ma sens, ponieważ Int nie może być magicznie przetłumaczone na klasę Java, zakładałem, że zostanie przetłumaczone na Integer. – pcalcao

Powiązane problemy