【问题标题】:Scala - declare a Java List that can hold anythingScala - 声明一个可以容纳任何东西的 Java 列表
【发布时间】:2017-08-09 13:56:45
【问题描述】:

在 Scala 中,我如何声明一个可以容纳任何东西的 Java List?

如果我尝试在其中放入一个元组,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))
}

【问题讨论】:

  • 编译器说you may wish to investigate a wildcard type such as _ &lt;: Object。你试过了吗?
  • 我认为您没有显示产生实际错误的代码。

标签: java scala twirl


【解决方案1】:

使用 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[_ &lt;: Object],如错误消息所示。 另请注意,您可以将 Scala 集合传递给 Java 应用程序,因为在运行时,Scala 代码由与 JVM 兼容的编译字节码表示。

【讨论】:

  • 嗯,我不想这样做,因为我正在使用带有 Java 的 play 框架,所以发送一个 Java 列表 - 你也没有真正回答这个问题!
  • 抱歉 - 对“在 Scala 中,我如何声明一个包含任何内容的列表”感到困惑。我认为您需要一个包含任何内容的列表,在 Scala 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2015-02-25
  • 1970-01-01
  • 2010-11-29
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多