我已经了解到,Scala并未检查其方差位置的对象专用(private[this]
)或对象保护(protected[this]
)定义。为什么不检查它们是安全的?为什么不检查对象专用或对象保护定义的差异位置?
我已经阅读了一些与之相关的资料,但未能找到完整的答案。首先,Odersky的,等人的“编程在斯卡拉”说:
http://www.artima.com/pins1ed/type-parameterization.html#19.7
原来,访问来自定义它们不会引起变异的问题相同的对象变量。直观的解释是,为了构造方差会导致类型错误的情况,您需要引用一个包含对象的引用,该对象的静态类型比定义对象的类型要弱。
我不知道到底是什么,作者的意思是“一个含对象”和“静态弱类型”。代码示例在这里更可取。
其次,“senia”在Scala Modifiers and Type parametrization中给出了一个很好的例子,它显示了类别私有(private
)字段可能存在什么问题。 这个例子说服了我为什么应该检查类私有成员的差异性位置,但没有给出我们不必检查对象私有/受保护定义的原因的答案。我知道getOtherCache()
这样的代码不能用对象专用字段写入。但是它并没有证明对象 - 私有/计划定义的无害性,我们没有编写一个程序,即对象 - 私有/计划定义导致方差问题。
三,Michid简要提及的话题,而decsribing如何实现在斯卡拉功能的memoization:
http://michid.wordpress.com/2009/02/23/function_mem/
class Memoize1[-T, +R](f: T => R) extends (T => R) { ... private[this] val vals = mutable.Map.empty[T, R] ... }
但是由于瓦尔斯从其仅包含实例访问,也不会引起问题有差异。
不幸的是,它不能回答我的问题:“与方差有关的访问控制是如何(或为什么)?”。
您能否更详细地解释不检查对象专用/受保护定义的方差位置(或提供一些参考)的基本原理?