我可以在Java中直接使用scala列表吗?
我可以在Java中使用scala列表吗,比如:我可以在Java中直接使用scala列表吗?,java,scala-collections,scala-java-interop,Java,Scala Collections,Scala Java Interop,我可以在Java中使用scala列表吗,比如: import scala.collection.immutable.List; class HelloScalaList { public static void main (String[] args) { List xs = List(1, 2, 3); System.out.println(xs); } } 它似乎没有编译。找不到列表$。请应用方法 当我把它改成 List xs = Dir.l
import scala.collection.immutable.List;
class HelloScalaList {
public static void main (String[] args) {
List xs = List(1, 2, 3);
System.out.println(xs);
}
}
它似乎没有编译。找不到列表$。请应用方法
当我把它改成
List xs = Dir.ls()
其中Dir是我的scala类,ls()返回一个scala列表,编译器对此表示不满
“内部编译器错误:java.lang.ClassCastException:org.eclipse.jdt.Internal.compiler.lookup.BaseTypeBinding
无法强制转换为位于的org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding
org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.initializeTypeVariable(BinaryTypeBinding.java:927)”
我不知道这是什么意思
我想用scala编写一些库,但也希望在Java中使用它 在我的scala类中,有一些方法返回scala列表,java代码要使用它们,我有两个选项:
但是我无法在Java中运行scala List。此语法的问题:
List xs=List(1,2,3)代码>
这是Scala,不是Java。当您实例化Scala中的对象时,语法糖会调用类的伴生对象的apply()方法。您必须在Java中手动执行此操作
实际上,您并没有创建scala.collection.immutable.List(抽象):
从Java调用Scala远不如从Scala调用Java有趣。我认为将Scala列表转换为Java集合会更容易。在Java中使用任何Scala List高阶函数都是很困难的,如果没有这些函数,您几乎就拥有了一个Java集合。一个小小的Java侧帮助器方法可以实现以下目的:
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;
}
}
导入scala.collection.immutable.List;
导入scala.collection.immutable.List$;
导入scala.collection.immutable.$colon$colon;
公共类helloscalist{
公共静态void main(字符串[]args){
列表xs=列表(1,2,3);
System.out.println(xs);
}
公共静态列表(T…ts){
列表结果=列表$.MODULE$.empty();
对于(int i=ts.length;i>0;i--){
结果=新的$冒号$冒号(ts[i-1],结果);
}
返回结果;
}
}
[更新]
由于这个问题,我启动了一个名为“Scava”的小项目,以支持从Java到Scala的调用:在Scala 2.10中,我没有成功地使用上述技巧
但您可以使用以下代码:
public static <T> scala.collection.immutable.List<T> scalaList(List<T> javaList) {
return scala.collection.JavaConversions.asScalaIterable(javaList).toList();
}
publicstaticscala.collection.immutable.List scalaList(List javaList){
返回scala.collection.JavaConversions.asScalaIterable(javaList.toList();
}
谢谢你的努力,但正如Janx所指出的,将Scala列表转换为Java列表有什么好处?@Luigi Plinge:linky被杀了,因为它没有我想象的那么有用,里面有一些危险的东西,与Scala 2.9的集成变得更好。在Scala 2.12中测试,我不能直接导入$colon$colon
,相反,我需要导入scala.collection.immutable.*代码>
public static <T> scala.collection.immutable.List<T> scalaList(List<T> javaList) {
return scala.collection.JavaConversions.asScalaIterable(javaList).toList();
}