2013-03-31 13 views
9

Aktualizuję mój projekt 2.9. * Do wersji 2.10. Mam kilka klas dla typów podstawowych (kątów, długości, itp.), Które wydają się być idealnymi kandydatami do typów wartości. Niestety mój kod Java, który używa tych typów, nie kompiluje się i nie mogę zrozumieć, dlaczego. Uprościłem to do bardzo prostego zestawu kodów. Wszelkie sugestie będą mile widziane.przy użyciu Scala 2.10.1 Typy wartości w Javie

kątowa klasa Definition (Scala)

package com.example.units 

class Angle(val radians : Double) extends AnyVal 
{ 
    def degrees = radians * 180.0/math.Pi 
} 

object Angle 
{ 
    val Zero = new Angle(0) 
} 

Kąt Przypadek Testowy (boleśnie napisany w Javie)

package com.example.units; 

import junit.framework.Assert; 
import org.junit.Test; 

public class AngleTest 
{ 
    @Test 
    public static void TestZero() 
    { 
     Angle a = Angle.Zero(); 
     Assert.assertEquals(a.degrees(), 0, 1E-9); 

    } 

} 

Kiedy skompilować, otrzymuję ten błąd:

AngleTest.java:19 incompatible types 
found :double 
required: com.example.units.Angle 
Angle a = Angle.Zero(); 

      ^

To wygląda s do mnie tak, jakby Angle.Zero był zwracany jako double, a nie Angle. Próbowałem dodać metody box/unbox, ale nadal otrzymuję ten sam błąd. Ponownie, każda pomoc będzie bardzo ceniona.

Odpowiedz

10

Scala kompilator przekształca klasy wartości w ich typy unboxed, co eliminuje ich koszt dla środowiska wykonawczego. Kontrola skompilowany plik klasy dla Angle, zobaczysz:

public static double Zero(); 

Więc z punktu widzenia Java, Angle.Zero zwraca podwójne; nie jest świadomy semantyki klas wartościowych Scali.

własne metody

kąt, jak np degrees, dostać zebrane w) statyczną metodę rozszerzenia, które odbywają się w wartości bez opakowania (double) b) metody instancji:

public static double degrees$extension(double); 
public double degrees(); 

co oznacza, że ​​może on być nadal wywołano instancję Angle w języku Java:

Angle a = new Angle(0); 
Assert.assertEquals(a.degrees(), 0, 1E-9); 
+0

Dzięki za odpowiedź. Używam metod fabrycznych całkiem sporo w moich klasach towarzyszących (Angle.fromDegrees(), Angle.fromRadians(), itp.), Aby poprawić czytelność. Obecnie wszystkie te metody mają taki sam problem, jak opisano powyżej. Wydaje mi się, że powinien istnieć sposób, aby to zadziałało. – fbl

+1

Jestem zdecydowanie ciekawy, jak to działa. Po wypróbowaniu kilku obejść nic nie wydaje się eleganckie (na przykład w testach Java można zawijać wartość otrzymaną od wywołania .Zero() pod kątem, ale to zmniejsza czytelność). Myślę, że główną przyczyną jest to, że klasy wartości Scala nie są zaprojektowane dla takiej samej interoperacyjności z Javą, jak są to zwykłe klasy; to tylko abstrakcyjna kompilacja, aby uprościć kod Scala. Sugeruję używanie regularnych lekcji w twojej sprawie. –

+0

Niestety doszedłem do tego samego wniosku. Jeśli nie jest to błąd, oznacza to przynajmniej wadę konstrukcyjną w/typ wartości. Jedną z mocnych stron Scalas jest możliwość współdziałania z kodem Java. Uniknę ich użycia, dopóki nie zostanie skierowana. – fbl

Powiązane problemy