我是 Scala 世界的新手,现在我正在阅读名为“Scala in Action”的书(Nilanjan Raychaudhuri 着),即第 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]?
非常感谢,
安德鲁