在Java中使用scala List和Enumeration

时间:2016-06-07 10:33:40

标签: java list scala enumeration

我无法找到解决此问题的方法:

我有这个scala代码

package testScala

import scala.collection.JavaConversions._
import collection.mutable._

object TypeEnum extends Enumeration {
  type TypeEnum=Value
  val A, B, C, D, E = Value
}

import TypeEnum._

case class Foo(param1: TypeEnum, param2: List[Int]) {
  def length: Int = param2.length
}

Java代码:

package testJava;

import java.util.List;
import java.util.ArrayList;

import scala.collection.JavaConversions;

import testScala.TypeEnum;
import testScala.Foo;



public class testJava {
    public static void main (String[] args)
    {

        List<Object> l1 = new ArrayList<>();
        l1.add(1);
        l1.add(2);

        //Error here
        Foo f = new Foo(TypeEnum.A(), JavaConversions.asScalaBuffer(l1).toList());

    }
}

我收到错误&#34;构造函数Foo(Enumeration.Value,List)未定义&#34;。

如何从类型Foo实例化一个新对象(带有非空列表)?提前谢谢。

2 个答案:

答案 0 :(得分:2)

以下是如何做到这一点

scala文件:

import scala.collection.immutable.List;
import test.TypeEnum;
import test.Foo;

public class Test {
    public static void main(String[] args) {
        Foo foo = new Foo(TypeEnum.A(), null);
        System.out.println(foo.param1());
    }
}

java文件:

val

但也许最好不要。使用java中的scala可能会很麻烦,特别是当你将scala集合放在api中时。

请注意,按照惯例,您应该使用大写字母开始您的类的名称,并且您不应该为案例类的字段添加Foo,因为它们是隐式添加的。

修改

要回答评论,我使用sum方法对case class Foo(param1: TypeEnum, param2: List[Int]) { def sum = param2.sum } 进行了扩展测试。

Foo

您正在进行转换,但从javas的角度来看,List<Object>需要ArrayList,因此您需要Objects包含List<Object> list = new ArrayList<>(); list.add(2); list.add(4); Foo foo = new Foo(TypeEnum.A(), JavaConversions.asScalaBuffer(list).toList()); System.out.println(foo.param1()); System.out.println(foo.sum());

ArrayList<Integer>

因此,为了从ArrayList<Object>ArrayList<Object>,我认为你需要创建一个新的import scala.collection.JavaConverters._ class FooAdapter(param1: TypeEnum, param2: java.util.List[Integer]) extends Foo(param1, param2.asScala.map(_.intValue).toList) 并读取所有元素。正如我之前所说的非常脏的东西。最好只创建一个scala包装器,它接受java类型并转换和委托列表。

修改

由于您提供的代码对我有用,也许您有其他原因导致问题。我只使用scala 2.11.8创建了包含2个文件的sbt项目并编译。

这是我之前提到的适配器类

ArrayList<Integer>

它会让你只从Java传递 $('#userList').DataTable({ sortable: true, processing: true, serverSide: true, ajax: { url: 'include/dades_customers.php', type: 'POST' }, columns: [ {"data": "CustName"}, {"data": "Address1"}, {"data": "Address2"}, {"data": "City"}, {"data": "PostCode"}, {"data": "State"}, {"data": "Country"}, {"data": "Phone"}, {"data": "Fax"}, {"data": "Web"} ], lengthMenu: [ 2, 5, 10, 25, 50, 75, 100 ], //dom: '<"H"fi>rt<"F"lp><"clear">' dom: '<"top"fiB><"content"rt><"footer"lp><"clear">', buttons: [ 'colvis' ] /*footerCallback: function( tfoot, data, start, end, display ) { var api = this.api(); $( api.column( 5 ).footer() ).html( api.column( 5 ).data().reduce( function ( a, b ) { return a + b; }, 0 ) ); } */ });

答案 1 :(得分:0)

Scala枚举是object。与任何object一样,它可以使用后缀$.MODULE$

从Java中使用
TypeEnum$.MODULE$.A()