我可以在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

我可以在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.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列表

  • 编写一个为这些方法返回java.util.List的包装类

  • 我更喜欢选项1,因为否则我将不得不为几乎所有的scala类编写一个包装器类


    但是我无法在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();
      }