Utilisation de types de valeur Scala 2.10.1 en Java

Je mets à jour mon projet 2.9. * À 2.10. J’ai plusieurs classes pour les types fondamentaux (angles, longueurs, etc.) qui semblent être des candidats parfaits pour les types valeur. Malheureusement, mon code Java qui utilise ces types ne comstack pas et je ne comprends pas pourquoi. Je l’ai simplifié à un ensemble de code très simple. Toute suggestion serait très appréciée.

Définition de classe d’angle (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) } 

Angle Test Case (écrit douloureusement en Java)

 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); } } 

Quand je comstack, j’obtiens cette erreur:

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

Il me semble que Angle.Zero est renvoyé comme un double, pas comme un angle. J’ai essayé d’append des méthodes box / unbox, mais je continue à recevoir la même erreur. Encore une fois, toute aide serait grandement appréciée.

Le compilateur Scala transforme les classes de valeur en leur type sans boîte, ce qui élimine leur coût pour l’exécution. En inspectant le fichier de classe compilé pour Angle , vous verrez:

 public static double Zero(); 

Donc, du sharepoint vue de Java, Angle.Zero renvoie un double; il n’est pas conscient de la sémantique des classes de valeur de Scala.

Les propres méthodes d’Angle, telles que les degrees , sont compilées en a) une méthode d’extension statique qui prend en valeur la valeur non encadrée ( double ) b) une méthode d’instance

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

Ce qui signifie que ce dernier peut toujours être appelé sur une instance d’ Angle en Java:

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