在Java中使用Scala的2.10.1值类型(using Scala 2.10.1 Value T

2019-08-18 09:59发布

我更新我的2.9。*的项目到2.10。 我有几个班是看起来他们是值类型的完美对象基本类型(角度,长度等)。 不幸的是,使用这些类型我的Java代码没有编制,我想不通为什么。 我已经简化它归结为一个非常简单的代码集。 任何建议将不胜感激。

角类定义(斯卡拉)

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

角度测试案例(痛苦地用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);

    }

}

当我编译,我得到这个错误:

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

            ^

在我看来,就好像Angle.Zero被返回双,而不是一个角。 我尝试添加盒/拆箱方法,而是继续收到同样的错误。 同样,任何帮助将不胜感激。

Answer 1:

Scala编译器轮流值班到他们的拆箱类型,从而消除他们的成本运行。 检查的编译的类文件Angle ,你会看到:

public static double Zero();

因此,从Java的角度来看,Angle.Zero返回一个double; 它不知道Scala的值类的语义。

安氏自己的方法,如degrees ,编译为一个),其采用的拆箱值(静态扩展方法double )B)的实例方法:

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

这意味着后者仍然可以被称为上的实例Angle在Java中:

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


文章来源: using Scala 2.10.1 Value Types in Java