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,斯卡拉 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 库 jar 来编译任何扩展 Scala 类的 Java 代码。例如:

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 回答