我可以直接在Java中使用scala List吗? [英] Can I use scala List directly in Java?
问题描述
我可以在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。 internal.compiler.lookup.BaseTypeBinding
无法强制转换为
org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.initializeTypeVariable(BinaryTypeBinding)中的org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding .java:927)
"Internal compiler error: java.lang.ClassCastException: org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding cannot be cast to org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding at org.eclipse.jdt.internal.compiler.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的调用: http://code.google.com/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: http://code.google.com/p/scava-org/
这篇关于我可以直接在Java中使用scala List吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!