3

Scala クラスを定義すると:

 class X(i:Int) {
   println (i)
 }

このクラスを Java コードで使用するにはどうすればよいですか?

[編集] 実際、私の問題はもう少し複雑です

私は抽象クラスを持っています

 abstract class X(i:Int) {
   println (i)
   def hello(s:String):Unit
 }

これをJavaコードで使用する必要があります。簡単にできますか?

[EDIT2] 次のコードを検討してください

 object B {
    case class C(i:Int)
 }
 abstract class X(i:Int) {
   println (i)
   def hello(a:B.C):Unit
 }

この場合、次の Java コードは Netbeans IDE でエラーを返しますが、正常にビルドされます。

 public class Y extends X  {
    public void hello(B.C c) {
       System.out.println("here");
    }
    public Y(int i) {
       super(i);
    }
 }

私が得るエラーは次のとおりです。

hello(B.C) in Y cannot override hello(B.C) in X; overridden method is static, final

Netbeans 6.8、Scala 2.8。

今のところ、唯一の解決策は NB エラーを無視することだと思います。

これは、私が得る正確なエラーを示す画像です: Java からの scala コードを使用した IDE エラー

4

3 に答える 3

7

クラス用に生成されたバイトコードは、Java 定義と同じになります。

abstract class X implements scala.ScalaObject {
  public X(int i) {
    System.out.println(i);
  }

  public abstract void hello(String s);

  //possibly other fields/methods mixed-in from ScalaObject
}

この同等の Java とまったく同じように使用してください。サブクラス化し、helloメソッドの具体的な実装を提供します。

于 2011-06-03T21:24:09.423 に答える
3

Scala クラスを拡張する Java コードをコンパイルするには、クラスパスで Scala ライブラリ jar を渡す必要があります。例えば:

dcs@ayanami:~/tmp$ cat X.scala
abstract class X(i:Int) {
   println (i)
   def hello(s:String):Unit
}

dcs@ayanami:~/tmp$ scalac X.scala
dcs@ayanami:~/tmp$ cat Y.java
public class Y extends X {
    public Y(int i) {
        super(i);
    }

    public void hello(String s) {
        System.out.println("Hello "+s);
    }
}
dcs@ayanami:~/tmp$ javac -cp .:/home/dcs/github/scala/dists/latest/lib/scala-library.jar Y.java
于 2011-06-03T21:33:24.347 に答える
1

Java から Scala コードを呼び出すことができるはずです (おそらく名前マングリングなどを使用して)。以下を試してみるとどうなりますか?

X x = new X(23);

より複雑なケースでは、javapまたは同様のツールを使用して、Scala コードがどのように変換されたかを調べることができます。他に何も機能しない場合でも、Scala 側でいくつかのヘルパー メソッドを記述して、Java 側からのアクセスを容易にすることができます (たとえば、暗黙が含まれている場合)。

于 2011-06-03T21:10:07.050 に答える