Scala的内部类和Java的内部/嵌套类之间有什么区别?

Scala如何以不同于Java的嵌套,静态或非静态类的方式处理内部类?

主要的区别在于,如果你有

class Outer { class Inner { def foo(x: Inner): Inner = this // just for the example below } } 

和两个Outer实例:

 val a = new Outer val b = new Outer 

那么a.Innerb.Inner是两种不同的类型(在Java中它们都是Outer.Inner ),所以你不能这样做

 val aInner = new a.Inner val bInner = new b.Inner aInner.foo(bInner) 

他们确实有一个共同的超类型,写在Outer#Inner

Scala具有适当的嵌套类,就像它们最初在Beta中发明的那样。 Java的内部类不是嵌套类。 主要区别在于嵌套类嵌套在封闭对象中 ,而不仅仅是封闭类中的内部 。 IOW:嵌套类是封闭类的对象的运行时实例属性,就像同一个类的两个不同实例具有相同名称但不同的值实例变量(字段)一样,它们也具有相同名称但不同值的嵌套类。

IOW, foo.SomeInnerClassbar.SomeInnerClass是不同的类,而不是类型兼容的。