1

假设我有:

var pairOfObjects = ListBuffer("", myDate)

哪里myDate是 type 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 会导致如此复杂的类型?

4

1 回答 1

1

Scala 中的 List 是协变的。

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

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

type String = java.lang.String

JavaString类声明

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 中的 classDateStringclass 都是继承自java.io.Serializable而不是Any直接继承的类,因此您看不到ListBuffer[Any]列表元素何时是Dateand String

因此从这些声明

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)

Any是下界类型java.util.dateString上界是java.io.Serializable

于 2018-03-09T10:00:43.280 回答