在 Java 中使用 Scala 列表和枚举
Use scala List and Enumeration in Java
我找不到这个问题的解决方案:
我有这个 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());
}
}
我收到错误 "The constructor Foo(Enumeration.Value, List) is undefined"。
我如何从 Foo
类型(使用非空列表)实例化一个新对象?提前致谢。
Scala 枚举是 object
。与任何 object
一样,它可以从 Java 使用后缀 $.MODULE$
TypeEnum$.MODULE$.A()
这里是你如何做到这一点
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.
时
请注意,按照惯例,您的 class 名称应以 capital 字母开头,并且不应将 val
用于大小写字段 classes 因为它们是隐式添加的。
编辑
为了回答评论,我用 sum
方法扩展了 Foo
进行测试。
case class Foo(param1: TypeEnum, param2: List[Int]) {
def sum = param2.sum
}
您的转换是正确的,但从 java 的角度来看,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 类型并转换和委托列表的 Scala 包装器。
编辑
因为您提供的代码对我有用,所以您可能有其他原因导致了问题。我只是用 2 个文件创建了 sbt 项目,使用 scala 2.11.8 并编译它。
这是我之前提到的适配器class
import scala.collection.JavaConverters._
class FooAdapter(param1: TypeEnum, param2: java.util.List[Integer])
extends Foo(param1, param2.asScala.map(_.intValue).toList)
它会让你从 java.
传递一个 ArrayList<Integer>
我找不到这个问题的解决方案:
我有这个 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());
}
}
我收到错误 "The constructor Foo(Enumeration.Value, List) is undefined"。
我如何从 Foo
类型(使用非空列表)实例化一个新对象?提前致谢。
Scala 枚举是 object
。与任何 object
一样,它可以从 Java 使用后缀 $.MODULE$
TypeEnum$.MODULE$.A()
这里是你如何做到这一点
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.
时请注意,按照惯例,您的 class 名称应以 capital 字母开头,并且不应将 val
用于大小写字段 classes 因为它们是隐式添加的。
编辑
为了回答评论,我用 sum
方法扩展了 Foo
进行测试。
case class Foo(param1: TypeEnum, param2: List[Int]) {
def sum = param2.sum
}
您的转换是正确的,但从 java 的角度来看,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 类型并转换和委托列表的 Scala 包装器。
编辑
因为您提供的代码对我有用,所以您可能有其他原因导致了问题。我只是用 2 个文件创建了 sbt 项目,使用 scala 2.11.8 并编译它。
这是我之前提到的适配器class
import scala.collection.JavaConverters._
class FooAdapter(param1: TypeEnum, param2: java.util.List[Integer])
extends Foo(param1, param2.asScala.map(_.intValue).toList)
它会让你从 java.
传递一个ArrayList<Integer>