在阅读SI-1419时,我想知道为什么内部课程在他们不是最终/私人时总是需要指向周围课程的指针。
一般来说,这是匹配内部对象所必需的,但不知何故编译器并不关心这一点,并且不允许final
类:
class A { class B }
val a = new A
val a2 = new A
val b = new a2.B
(b: Any) match {
case _: a.B => 1
case _: a2.B => 2
}
===> 2
但是将课程改为最终:
class A { final class B }
val a = new A
val a2 = new A
val b = new a2.B
(b: Any) match {
case _: a.B => 1
case _: a2.B => 2
}
<console>:17: warning: The outer reference in this type test cannot be checked at run time.
case _: a.B => 1
^
<console>:18: warning: The outer reference in this type test cannot be checked at run time.
case _: a2.B => 2
^
===> 1
因此,此测试的结果取决于此处的final
字。根据我对2的理解,这不是外部字段的唯一原因,但是对于扩展此内部类的类的构造函数来说,这个字段似乎是必需的。我真的不明白这里的推理。也许你可以帮我一个例子:
当嵌套类是final时,您可以在本地推断是否 需要外部访问器(模式匹配类型除外) 测试,在没有外场的情况下被削弱)。 如果 class不是final,是一个子类(可能在一个单独的中定义) 编译单元/运行)可能导致需要外部访问器。请参阅 https://github.com/scala/scala/blob/2.11.x/src/compiler/scala/tools/nsc/transform/Constructors.scala#L113-L116