Scala - 声明一个可以容纳任何东西的Java List

时间:2017-03-17 21:11:55

标签: java scala twirl

在Scala中,如何声明可以容纳任何内容的Java List?

如果我尝试在其中放入一个元组,列表[Object]会感到沮丧,Scala错误说

type mismatch; found :     java.util.List[Triple[Integer,Integer, Integer]] required: 
java.util.List[Object] Note: Triple[Integer,Integer, Integer] <: Object, but Java-defined 
trait List is invariant in type E. You may wish to investigate a wildcard type 
such as `_ <: Object`. (SLS 3.2.10)

我不知道这意味着什么,如何声明列表以容纳三元组(或元组,或任何

我的代码看起来像这样(它是旋转的,所以它有@,但它只是Scala代码):

@import java.util.List;

@(field:List[Object], min:Int=1)(f: Object, Int) => Html)
@{
    (0 until math.max(if (field.isEmpty) 0 else field.size, min))
        .map(i => f(field.get(i),i))
}

1 个答案:

答案 0 :(得分:0)

使用Scala(非Java)集合,例如scala.collection.Seq[Any]。如果它需要是可变的,请查看scala.collection.mutable

scala> val t = Tuple3[Int,Int,Int](1,2,3)
t: (Int, Int, Int) = (1,2,3)

scala> val listAny: Seq[Any] = Seq[Any](t,t,5,"happy now?")
listAny: Seq[Any] = List((1,2,3), (1,2,3), 5, happy now?)

如果您坚持使用Java集合,则可以按照错误消息的建议尝试field:List[_ <: Object]。 另请注意,可以将Scala集合传递给Java应用程序,因为在运行时,Scala代码由与JVM兼容的已编译字节码表示。