Я новичок в мире Scala, и теперь я читаю книгу под названием «Scala in Action» (Ниланджан Райчаудхури), а именно часть под названием «Изменяемый объект должен быть инвариантным» на странице 97, и я не понимаю следующую часть, которая взято прямо из упомянутой книги.
Предположим, что ListBuffer ковариантен, и следующий фрагмент кода работает без каких-либо проблем с компиляцией:
scala> val mxs: ListBuffer[String] = ListBuffer("pants")
mxs: scala.collection.mutable.ListBuffer[String] =
ListBuffer(pants)
scala> val everything: ListBuffer[Any] = mxs
scala> everything += 1
res4: everything.type = ListBuffer(1, pants)
Вы можете определить проблему? Поскольку все имеет тип Any, вы можете сохранить целочисленное значение в коллекции строк. Это катастрофа ждет своего часа. Чтобы избежать подобных проблем, всегда рекомендуется делать изменяемые объекты неизменными.
У меня были бы следующие вопросы ..
1) Какой тип everything
на самом деле? String
или Any
? Объявление - "val everything: ListBuffer[Any]
", и, следовательно, я ожидал Any
, и поскольку все должно быть типа Any
, я не вижу никаких проблем, чтобы иметь Integer
и String
в одном ListBuffer[Any]
. Как я могу сохранить целочисленное значение в коллекции строк, как они пишут ??? Почему катастрофа ??? Почему я должен использовать List (который является неизменным) вместо ListBuffer (который является изменяемым)? Не вижу разницы. Я нашел много ответов о том, что изменяемые коллекции должны иметь инвариантный тип, а неизменные коллекции должны иметь ковариантный тип, но почему?
2) Что означает последняя часть «res4: everything.type = ListBuffer(1, pants)
»? Что означает "everything.type"? Я предполагаю, что everything
не имеет метода / функции или переменной с именем type
.. Почему нет ListBuffer [Any] или ListBuffer [String]?
Большое спасибо,
Эндрю