【问题标题】:Why isn't a ListBuffer with String and Date elements ListBuffer[Any]?为什么不是带有 String 和 Date 元素 ListBuffer[Any] 的 ListBuffer?
【发布时间】:2018-03-09 09:05:57
【问题描述】:

假设我有:

var pairOfObjects = ListBuffer("", myDate)

其中myDate 的类型为java.util.Date,其值为1970-01-01T00:00:00.000-00:00

把它放到 Scala REPL 中告诉我: pairOfObjects: scala.collection.mutable.ListBuffer[Comparable[_ >: java.util.Date with String <: Comparable[_ >: java.util.Date with String <: java.io.Serializable] with java.io.Serializable] with java.io.Serializable] = ListBuffer("", Wed Dec 31 16:00:00 PST 1969)

我希望它类似于ListBuffer[Any]。事实上,当我输入时:

var pairOfObjects = ListBuffer("", 1)

Scala REPL 确实给了我:

pairOfObjects: scala.collection.mutable.ListBuffer[Any] = ListBuffer("", 1)

为什么将 Date 对象放入 ListBuffer 会导致类型如此复杂?

【问题讨论】:

  • 你可以像这样显式定义类型。 var pairOfObjects: ListBuffer[Any] = ListBuffer("", myDate)

标签: scala types listbuffer


【解决方案1】:

Scala 中的列表是协变的。

Int 和 Double 的示例是 Double 的子类型,那么 List[Int] 和 List[Double] 也是 List[Double] 的子类型。

这是来自Predef对象的string在scala中的定义

type String = java.lang.String

Java String 类声明

public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence

java.util.date类声明

public class Date
extends Object
implements Serializable, Cloneable, Comparable<Date>

现在查看这些定义后,Java 中的 DateString 类都是从 java.io.Serializable 继承的类,而不是直接从 Any 继承的类,因此当列表元素为 @987654334 时,您看不到 ListBuffer[Any] @ 和 String

据此声明

scala.collection.mutable.ListBuffer[Comparable[_ &gt;: java.util.Date with String &lt;: Comparable[_ &gt;: java.util.Date with String &lt;: java.io.Serializable] with java.io.Serializable] with java.io.Serializable] = ListBuffer("", Wed Dec 31 16:00:00 PST 1969)

Any 是绑定到java.util.date 的下限类型,String 是绑定到java.io.Serializable 的上限

【讨论】:

  • 换一种说法:ListBuffer 的类型是由其中的元素共享的第一个超类型决定的? docs.scala-lang.org/tour/variances.html 也帮助我理解了这个概念。我仍然不明白为什么该类型有一些嵌套结构。 String 和 Date 都是 Comparable 的,所以我想 ListBuffer 将它与 Serializable 一起包含在它的类型中是有道理的。
猜你喜欢
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2020-02-16
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多