Почему 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

Другие вопросы по тегам