我们说我得到了:
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会产生如此复杂的类型?
答案 0 :(得分:1)
Scala中的List是协变的。
Int和Double的示例是Double的子类型,然后List [Int]和List [Double]也是List [Double]的子类型。
以下是来自string
对象
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中的Date
和String
类都是来自java.io.Serializable
而不是Any
的继承类,所以你不会看到列表元素为ListBuffer[Any]
和Date
时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.date
的{{1}}的较低类型,String
的上限为java.io.Serializable