2012-06-23 16 views
14

w Scala,Dlaczego typy pierwotne, takie jak Int Intrased to Object in Scala?

{ x: Option[Int] => x } 
    .getClass 
    .getMethod("apply", classOf[Option[_]]) 
    .getGenericParameterTypes 

powraca Array(scala.Option<java.lang.Object>). Początkowo spodziewałem się zobaczyć zamiast tego Array(scala.Option<scala.Int>), ale widzę, że scala.Int jest klasą wartości (rozszerza się AnyVal), "której instancje nie są reprezentowane jako obiekty przez podstawowy system hosta".

Mimo to nadal nie rozumiem usunięcia do Object. Czy nie może być o wiele bardziej użyteczna?

+1

To nie Scala robi to - to jest Java. Aby uzyskać użyteczność, tak jak w przypadku nieobiektu, wynika z "TypicParameterTypes" (metody obiektu klasy Java), należy utworzyć Subklasę. Scala * nie * utworzył podklasy, powiedz 'OptionInt', dla' Option [Int] '. (Zobacz @specjalized, być może?) –

+2

@ pst; Myślę, że jesteś na niewłaściwym torze. Zmień 'Int' na' Symbol' powyżej i otrzymasz 'Array (scala.Option )'. –

+0

Hmm, cóż tam jest moja hipoteza: -/I winię magię kompilatora. –

Odpowiedz

6

Czy nie może być o wiele bardziej użyteczna? java.lang.Integer?

Tak, i tak było nawet kiedyś. Niestety, prowadzi to do złamania sygnatur typu. To znaczy, niemożliwe jest wygenerowanie poprawnego kodu bajtowego we wszystkich sytuacjach, jeśli Int zostanie usunięte do java.lang.Integer.

Nie ma jednego biletu ani zatwierdzenia w tej sprawie, ale zmieniono to zachowanie na SI-4214, w this commit.

+0

Dzięki. Spojrzałem na 'git log --grep = Integer', ale nie widziałem niczego oczywistego. –

+0

@ScottMorrison Powinieneś wyszukiwać "podpis". W każdym razie znalazłem to dla ciebie. Zobacz poprawioną odpowiedź. –