我可以在Java中使用scala List,例如:
Can I use scala List in Java, like :
import scala.collection.immutable.List; class HelloScalaList { public static void main (String[] args) { List xs = List(1, 2, 3); System.out.println(xs); } }似乎没有编译。找不到List $ .apply方法。
It does not seem to compile. can't find List$.apply method.
当我将其更改为
List xs = Dir.ls()其中Dir是我的scala类,而ls ()返回一个scala List,编译器抱怨
where Dir is my scala class, and ls() returns a scala List, the compiler complaints about
内部编译器错误:java.lang.ClassCastException:org.eclipse.jdt。 internalpiler.lookup.BaseTypeBinding 无法强制转换为 org.eclipse.jdt.internalpiler.lookup.BinaryTypeBinding.initializeTypeVariable(BinaryTypeBinding)中的org.eclipse.jdt.internalpiler.lookup.ReferenceBinding .java:927)
"Internal compiler error: java.lang.ClassCastException: org.eclipse.jdt.internalpiler.lookup.BaseTypeBinding cannot be cast to org.eclipse.jdt.internalpiler.lookup.ReferenceBinding at org.eclipse.jdt.internalpiler.lookup.BinaryTypeBinding.initializeTypeVariable(BinaryTypeBinding.java:927)"
我不知道这是什么意思。
which I have no idea what it means.
我想在scala中编写一些库,但也希望在Java中使用它。
I want to write some library in scala, but would also like it to be used in Java.
In我的scala类有返回scala List的方法,对于java代码使用它们,我有两个选择:
In my scala class there are methods that return scala List, for java code to use them, I have two options:
使用scala直接在java中列出
use scala List in java directly
编写一个包装类,为这些方法返回java.util.List。
write a wrapper class that returns java.util.List for those methods.
我更喜欢选项1 ,因为否则我将不得不为几乎所有我的scala类编写一个包装类。
I'd rather like option 1, because otherwise I'll have to write a wrapper class for nearly ALL my scala classes.
但是我无法在Java中运行scala List。
But I just can't get scala List running in Java.
推荐答案一个小的java端辅助方法可以解决这个问题:
A little java-side helper method does the trick:
import scala.collection.immutable.List; import scala.collection.immutable.List$; import scala.collection.immutable.$colon$colon; public class HelloScalaList { public static void main (String[] args) { List xs = list(1,2,3); System.out.println(xs); } public static <T> List<T> list(T ... ts) { List<T> result = List$.MODULE$.empty(); for(int i = ts.length; i > 0; i--) { result = new $colon$colon(ts[i - 1], result); } return result; } }[更新]
由于这个问题,我开始了一个名为Scava的小项目,以支持从Java到Scala的调用: code.google/p/scava-org/
As a result of this question, I started a little project called "Scava" in order to support calls from Java to Scala: code.google/p/scava-org/
更多推荐
我可以直接在Java中使用scala List吗?
发布评论