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.
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
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. –
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