9

2.9.* プロジェクトを 2.10 に更新しています。基本型 (角度、長さなど) のクラスがいくつかありますが、それらは値型の完全な候補と思われます。残念ながら、これらの型を使用する Java コードはコンパイルされず、その理由がわかりません。非常に単純なコード セットに単純化しました。どんな提案でも大歓迎です。

角度クラスの定義 (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)
}

角度のテスト ケース (苦労して 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 が Angle ではなく double として返されているように見えます。box/unbox メソッドを追加しようとしましたが、引き続き同じエラーが発生します。繰り返しますが、どんな助けでも大歓迎です。

4

1 に答える 1

10

Scala コンパイラは値クラスをボックス化されていない型に変換し、実行時のコストを削減します。のコンパイル済みクラス ファイルを調べると、次のように表示されAngleます。

public static double Zero();

したがって、Java の観点から見ると、Angle.Zero は double を返します。Scala の値クラスのセマンティクスを認識していません。

などのAngle独自のメソッドは、 a)degreesボックス化されていない値を受け取る静的拡張メソッド( double) b) インスタンス・メソッドにコンパイルされます:

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

つまり、後者はAngleJavaのインスタンスで引き続き呼び出すことができます。

Angle a = new Angle(0);
Assert.assertEquals(a.degrees(), 0, 1E-9);
于 2013-03-31T18:03:31.177 に答える