使用Java中的参数和内部类调用scala抽象类

时间:2011-06-03 20:57:29

标签: java scala scala-java-interop

如果我定义了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错误。

这是一张显示我得到的确切错误的图片: IDE error using scala code from java

3 个答案:

答案 0 :(得分: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方法的具体实现。

答案 1 :(得分: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

答案 2 :(得分:1)

你应该可以从Java调用Scala代码(可能有一些名称修改等等)。如果您尝试以下操作会发生什么?

X x = new X(23);

在更复杂的情况下,您可以使用javap或类似工具来了解Scala代码的翻译方式。如果没有其他工作,你仍然可以在Scala端编写一些帮助方法,以便从Java端更容易访问(例如,当涉及到涉及的内容时)。