内部タイプは、トレイトQ
の特定のインスタンス実装に対してのみ定義されます。T
Scalaにはパスに依存する型があるため、の各インスタンスにT
は独自のサブトレイトがありQ
ます。
scala> trait T {
| trait Q
| }
defined trait T
scala> class C extends T {
| def getQ: this.Q = new this.Q {}
| }
defined class C
scala> val inC = (new C).getQ
inC: C#Q = C$$anon$1@3f53073a
scala> val c = new C
c: C = C@1a7e4ff0
scala> new c.Q {}
res4: c.Q = $anon$1@36bbb2f5
C
特定のインスタンスに依存せずに、クライアントが実装する一般的な動作のインターフェイスが必要な場合は、Object
scala> object T {
| trait Q {
| def implementMe: Unit
| }
| }
defined module T
scala> val inT = new T.Q {
| def implementMe = println("implemented!")
| }
inT: T.Q = $anon$1@20f2a08b
scala> inT.implementMe
implemented!
なぜパス依存型なのか?
デザイン上の理由はこちらをご覧ください