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

时间:2018-03-09 09:05:57

标签: scala types listbuffer

我们说我得到了:

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会产生如此复杂的类型?

1 个答案:

答案 0 :(得分:1)

Scala中的List是协变的。

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

以下是来自string对象

的scala中Predef的定义
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的继承类,所以你不会看到列表元素为ListBuffer[Any]DateString

从这些陈述

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.date的{​​{1}}的较低类型,String的上限为java.io.Serializable