为什么非最终非私有内部类总是需要引用外部对象

时间:2016-08-17 11:02:01

标签: scala

在阅读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

0 个答案:

没有答案