为什么带有字符串和日期元素的 ListBuffer 不是 ListBuffer[Any]?

Why isn't a ListBuffer with String and Date elements ListBuffer[Any]?

假设我有:

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)

为什么在ListBuffer中放入一个Date对象会导致这么复杂的类型?

Scala 中的列表是协变的。

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

这是 Predef object

中 scala 中 string 的定义
type String = java.lang.String

Java String class 声明

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

java.util.dateclass声明

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

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

因此从这些陈述

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)

Anyjava.util.date 的下限类型,Stringjava.io.Serializable

的上限