java - 在 Java 中使用 scala 列表和枚举

标签 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());

    }
}

我收到错误“构造函数 Foo(Enumeration.Value, List) 未定义”。

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

最佳答案

以下是您可以执行此操作的方法

scala 文件:

package test

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

import TypeEnum._

case class Foo(param1: TypeEnum, param2: List[Int])

java文件:

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 使用 scala 可能会很痛苦,特别是当您将 scala 集合放入 api 时。

请注意,按照惯例,您的类名称应以大写字母开头,并且不应输入 val对于案例类的字段,因为它们无论如何都是隐式添加的。

编辑

为了回答评论,我扩展了 Foosum测试方法。

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

你的转换是正确的,但从javas的角度来看,Foo需求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>并重新添加所有元素。正如我之前所说,非常肮脏的东西。最好只创建一个采用 java 类型并转换和委托(delegate)列表的 scala 包装器。

编辑

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

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

import scala.collection.JavaConverters._
class FooAdapter(param1: TypeEnum, param2: java.util.List[Integer])
  extends Foo(param1, param2.asScala.map(_.intValue).toList)

它会让你只传递一个ArrayList<Integer>来自java。

关于java - 在 Java 中使用 scala 列表和枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37676956/

相关文章:

java - 如何在java中对带有对象的链表进行排序

python - 我怎样才能用python中列表的顺序对字典进行排序

java - 在jsp中使用java和html打印列表

scala - 什么是List [String〜Int]?

java - 3D:如何渲染/创建地形

java - 如何使用 eclim 运行 java 程序?

java - 如何在 Java 中设置与 jackrabbit 存储库的连接超时

scala - Akka Streams 是否利用 Akka Actors?

scala - 如何在Scala中将takeWhile与迭代器一起使用

java - 如何使用 Eclipse 3.6 创建构建