-5

在 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)

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

我的代码看起来像这样(它是 twirl,所以它有 @,但它只是 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))
}
4

1 回答 1

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 兼容的编译字节码表示。

于 2017-03-17T21:28:00.943 回答