为什么带有字符串和日期元素的 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.date
class声明
public class Date
extends Object
implements Serializable, Cloneable, Comparable<Date>
现在,在查看这些定义后,java 中的 Date
和 String
class 都是从 java.io.Serializable
继承的 class 而不是直接来自 Any
,因此当列表元素为 Date
和 String
时您看不到 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)
Any
是 java.util.date
的下限类型,String
是 java.io.Serializable
的上限
假设我有:
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
string
的定义
type String = java.lang.String
Java String
class 声明
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence
java.util.date
class声明
public class Date
extends Object
implements Serializable, Cloneable, Comparable<Date>
现在,在查看这些定义后,java 中的 Date
和 String
class 都是从 java.io.Serializable
继承的 class 而不是直接来自 Any
,因此当列表元素为 Date
和 String
时您看不到 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)
Any
是 java.util.date
的下限类型,String
是 java.io.Serializable