我可以直接在Java中使用scala List吗? [英] Can I use scala List directly in Java?

查看:188
本文介绍了我可以直接在Java中使用scala List吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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


  1. 使用scala直接在java中列出

  1. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆