www with technology started org intellij how getting create java scala compiler-errors value-type

java - with - scala lang 3



utilizando los tipos de valor de Scala 2.10.1 en Java (1)

El compilador de Scala convierte las clases de valor en su tipo unboxed, lo que elimina el costo del tiempo de ejecución. Al inspeccionar el archivo de clase compilado para Angle , verá:

public static double Zero();

Entonces, desde el punto de vista de Java, Angle.Zero devuelve un doble; no tiene conocimiento de la semántica de las clases de valores de Scala.

Los propios métodos de Angle, como los degrees , se compilan en a) un método de extensión estático que toma el valor no incluido ( double ) b) un método de instancia:

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

Lo que significa que aún se puede invocar a este último en una instancia de Angle en Java:

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

Estoy actualizando mi proyecto 2.9. * A 2.10. Tengo varias clases para los tipos fundamentales (ángulos, longitudes, etc.) que parecen ser candidatos perfectos para los tipos de valores. Desafortunadamente, mi código de Java que usa estos tipos no está compilando, y no puedo entender por qué. Lo he simplificado a un conjunto de código muy simple. Cualquier sugerencia sería muy apreciada.

Definición de clase de ángulo (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 (dolorosamente escrito 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); } }

Cuando compilo, obtengo este error:

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

Me parece que Angle.Zero se devuelve como un doble, no como un ángulo. Traté de agregar los métodos de caja / unbox, pero sigo recibiendo el mismo error. Una vez más, cualquier ayuda sería muy apreciada.