Почему ListBuffer с элементами String и Date не является 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)
Почему помещение объекта Date в ListBuffer приводит к такому сложному типу?
1 ответ
Список в Scala является ковариантным.
Примером для Int и Double являются подтипы Double, затем List[Int] и List[Double] также являются подтипами List[Double].
Вот определение для string
в скале из Predef
объект
type String = java.lang.String
Джава 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>
Теперь, посмотрев на эти определения, оба Date
а также String
класс в Java наследуются классы от 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
с String
которые являются верхней границей java.io.Serializable