在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))
}
答案 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兼容的已编译字节码表示。