1.30

new内嵌类实例语法形式为new <外部类实例>.<内嵌类名>,而java中为<外部类实例>.new <内嵌类名>。

class P{
    class PNested
}
object P {
    class PInner
}

object app extends App {
    val p=new P
    val p2=new P
    val list1:ListBuffer[p.PNested] = ListBuffer()
    list1 += new p.PNested  // OK
    // list1 += new p2.PNested // compilation ERROR
    
    val list2:ListBuffer[P#PNested] = ListBuffer()
    list2 += new p.PNested  // OK
    list2 += new p2.PNested  // OK
    
    println(new p.PNested().getClass eq new p2.PNested().getClass)  // but this gets true
    
    val z = new P.PInner
}

class Outer{
    class Inner{
        def conn(n:Inner){}
    }
    def newInn:Inner=new Inner
    
}
val outer1=new Outer; val o1n1=new outer1.Inner;val o1n2=outer1.newInn;
val outer2=new Outer; val o2n1=outer2.newInn
o1n1.conn(o1n2); // OK,o1n1, o1n2类型均为o1.Inner
//! o1n2.conn(o2n1); // ERROR o1n1类型为o1.Inner,其conn方法期待的类型是o1.Inner,而o2n1类型为o2.Inner

class ... {
    class Inner {
        def conn(n: Outer#Inner){}
    }
}

class中可定义内嵌class或object,object的归属性质同class。

TODO 内嵌类访问外部类引用

posted @ 2024-01-30 08:44  秋渡晚枫  阅读(19)  评论(0)    收藏  举报