如果我定义了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错误。
这是一张显示我得到的确切错误的图片:
答案 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端更容易访问(例如,当涉及到涉及的内容时)。