14

次のように、Java で scala List を使用できますか。

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 メソッドが見つかりません。

に変更すると

List xs = Dir.ls()

ここで、Dir は私の scala クラスであり、ls() は scala List を返します。

「内部コンパイラ エラー: java.lang.ClassCastException: org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding は、org.eclipse.jdt.internal で org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding にキャストできません。 compiler.lookup.BinaryTypeBinding.initializeTypeVariable(BinaryTypeBinding.java:927)"

私はそれが何を意味するのか分かりません。


ライブラリを scala で書きたいのですが、それを Java でも使用したいと考えています。

私のscalaクラスには、scala Listを返すメソッドがあり、Javaコードでそれらを使用するには、2つのオプションがあります。

  1. javaでscala Listを直接使用する

  2. これらのメソッドの java.util.List を返すラッパー クラスを記述します。

オプション 1 が望ましいです。そうしないと、ほぼすべての scala クラスのラッパー クラスを作成する必要があります。

しかし、Java で実行されている scala List を取得できません。

4

3 に答える 3

18

Scala 2.10の時点で、上記のトリックでは成功しませんでした。

ただし、次のコードを使用できます。

  public static <T> scala.collection.immutable.List<T> scalaList(List<T> javaList) {
    return scala.collection.JavaConversions.asScalaIterable(javaList).toList();
  }
于 2013-07-16T15:28:32.807 に答える
14

ちょっとした 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;
    }
}

[アップデート]

この質問の結果、Java から Scala への呼び出しをサポートするために、「Scava」という小さなプロジェクトを開始しました: http://code.google.com/p/scava-org/

于 2010-12-24T09:34:30.760 に答える
6

この構文の問題:

List xs = List(1, 2, 3);

それはJavaではなくScalaだということです。Scalaでそのようなオブジェクトをインスタンス化すると、シンタックスシュガーはクラスのコンパニオンオブジェクトのapply()メソッドを呼び出します。Javaでは手動で行う必要があります。

そして、あなたは実際にscala.collection.immutable.List(抽象的)を作成していません:

scala> val list = List(1,2,3)                      
list: List[Int] = List(1, 2, 3)
scala> list.getClass                               
res12: java.lang.Class[_] = class scala.collection.immutable.$colon$colon

JavaからScalaを呼び出すことは、ScalaからJavaを呼び出すことほど楽しいことではありません。ScalaリストをJavaコレクションに変換する方が簡単だと思います。Scala Listの高階関数のいずれかを使用することは、Javaでは困難であり、それらがなければ、とにかくJavaコレクションがほとんどあります。

于 2010-12-24T08:06:52.480 に答える