我无法找到解决此问题的方法:
我有这个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
实例化一个新对象(带有非空列表)?提前谢谢。
答案 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$
TypeEnum$.MODULE$.A()