gpt4 book ai didi

scala - 为什么不检查对象私有(private)或对象保护定义的方差位置是安全的?

转载 作者:行者123 更新时间:2023-12-04 19:09:39 25 4
gpt4 key购买 nike

我了解到 Scala 不会检查对象私有(private)(private[this])或对象保护(protected[this])定义的方差位置。为什么不检查它们是安全的?

我已经阅读了一些与之相关的 Material ,但还没有找到完整的答案。首先,Odersky 等人的“Scala 编程”说:

http://www.artima.com/pins1ed/type-parameterization.html#19.7

It turns out that accesses to variables from the same object in which they are defined do not cause problems with variance. The intuitive explanation is that, in order to construct a case where variance would lead to type errors, you need to have a reference to a containing object that has a statically weaker type than the type the object was defined with.



我不确定作者所说的“包含对象”和“静态较弱的类型”究竟是什么意思。代码示例在这里会更可取。

其次,“senia”在 Scala Modifiers and Type parametrization 中给出了一个很好的例子。这显示了类私有(private)( private )字段可能存在差异的问题。
该示例使我相信为什么应该检查类私有(private)成员的方差位置,但没有给出关于我们不必检查对象私有(private)/ protected 定义的原因的答案。我知道这样的代码 getOtherCache()不能用对象私有(private)字段编写。但是它并没有证明我们没有编写一个程序来证明对象私有(private)/投影定义会导致方差问题。

第三,Michid 在描述如何在 Scala 中实现函数内存时简要提到了这个话题:

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]
...
}

However since vals is accessed from its containing instance only, it cannot cause problems with variance.



不幸的是,它没有回答我的问题“访问控制如何(或为什么)与方差相关?”。

您能否更详细地解释不检查对象私有(private)/ protected 定义的方差位置的理由(或提供一些引用资料)?

最佳答案

仅当对象的编译时和运行时类型不同时,才会出现方差问题:

val a: List[Any] = List("foo"): List[String]

这里 a静态类型 ( List[Any] ) 比定义的 ( List[String] ) 弱。此外,这同样适用于包含对象(即列表的元素)。 (静态类型 Any ,定义类型 String )。

如果我们有对象私有(private)(或对象保护)字段,就不会发生这种情况:
trait A[-T] {
protected[this] val x: T
}

当我们访问 x我们可以确定它实际上是 T 类型, 即使 A是逆变的,因为 this引用不能在某处向上转换。 (我们总是完全了解我们的自我类型)。

所以当我们回到奥德斯基的话,让我们来看看:
val cont: A[String] = new A[Any] { ... }
cont.x // BAD! Is `Any`, not `String`
cont是对静态类型比定义的类型更弱的对象的引用,这就是对 x 的引用的原因。不允许。 this 指针不会发生这种向上转换的情况,因此以下是可以的:
trait B[-T] extends A[T] {
def foo() {
// here, this has always the most specific type.
val tmp: T = this.x
// do stuff
}
}

关于scala - 为什么不检查对象私有(private)或对象保护定义的方差位置是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16428847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com