快學Scala 第八課 (嵌套類)
阿新 • • 發佈:2017-08-04
str new 外部 style 接收 rgs sca 外部類 logs
嵌套類:
class Human { class Student{ val age = 10 } } object ClassDemo { def main(args: Array[String]): Unit = { val h = new Human val s = new h.Student println(s.age) } }
有時會遇到這種情況:
class Human { class Student { def addS(s: Student) = { val ab = new ArrayBuffer[Student]() ab += s } } } object ClassDemo { def main(args: Array[String]): Unit = { val h = new Human val h2 = new Human val s = new h.Student val s2 = new h2.Student s.addS(s2) } }
以上addS會報錯,因為方法只能接收h.Student不能接收h2.Student。
解決方法有2個:
1. 類型投影
import scala.collection.mutable.ArrayBuffer class Human { class Student { def addS(s: Human#Student) = { val ab = new ArrayBuffer[Human#Student]() ab += s } } } object ClassDemo { def main(args: Array[String]): Unit = { val h = new Human val h2 = new Human val s = new h.Student val s2 = new h2.Student s.addS(s2) } }
2. 伴生對象
object Human { class Student { } } class Human { def addS(s: Human.Student) = { val ab = new ArrayBuffer[Human.Student]() ab += s } } object ClassDemo { def main(args: Array[String]): Unit = { val h = new Human val s = new Human.Student val s2 = new Human.Student h.addS(s) h.addS(s2) } }
嵌套類要訪問外部類有2種方式:
1. 外部類.this
class Human { val name = "Sky" class Student { println(Human.this.name) def addS(s: Student) = { val ab = new ArrayBuffer[Student]() ab += s } } }
2. “自身類型”
class Human { outter => class Student { println(outter.name) def addS(s: Student) = { val ab = new ArrayBuffer[Student]() ab += s } } val name = "Sky" }
快學Scala 第八課 (嵌套類)