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.Inner
和b.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.SomeInnerClass
和bar.SomeInnerClass
是不同的类,而不是类型兼容的。