Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I use scala List directly in Java?

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);
    }
}

It does not seem to compile. can't find List$.apply method.

when I change it to

List xs = Dir.ls()

where Dir is my scala class, and ls() returns a scala List, the compiler complaints about

"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.


I want to write some library in scala, but would also like it to be used in Java.

In my scala class there are methods that return scala List, for java code to use them, I have two options:

  1. use scala List in java directly

  2. write a wrapper class that returns java.util.List for those methods.

I'd rather like option 1, because otherwise I'll have to write a wrapper class for nearly ALL my scala classes.

But I just can't get scala List running in Java.

like image 430
Visus Zhao Avatar asked Dec 24 '10 07:12

Visus Zhao


People also ask

Can I use Scala in Java?

A Scala trait with no method implementation is just an interface at the bytecode level and can thus be used in Java code like any other interface.

Can we call Scala from Java and Java from Scala?

Scala classes are Java classes, and vice versa. You can call the methods of either language from methods in the other one. You can extend Java classes in Scala, and vice versa. The main limitation is that some Scala features do not have equivalents in Java, for example traits.

Is Scala list immutable?

Specific to Scala, a list is a collection which contains immutable data, which means that once the list is created, then it can not be altered. In Scala, the list represents a linked list. In a Scala list, each element need not be of the same data type.

What is difference between Array and list in Scala?

Following are the point of difference between lists and array in Scala: Lists are immutable whereas arrays are mutable in Scala. Lists represents a linked list whereas arrays are flat.


2 Answers

As of Scala 2.10, I didn't succeed with the tricks above.

But you can use the following code:

  public static <T> scala.collection.immutable.List<T> scalaList(List<T> javaList) {
    return scala.collection.JavaConversions.asScalaIterable(javaList).toList();
  }
like image 113
Sebastien Lorber Avatar answered Sep 19 '22 23:09

Sebastien Lorber


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;
    }
}

[Update]

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/

like image 25
Landei Avatar answered Sep 20 '22 23:09

Landei