Type projection
개요:
타입 안의 (nested) 타입 멤버를 레퍼런싱 하기 위한 문법이다.
T#x 라고 지칭하며, 타입 T 안의 x 라는 이름의 타입 멤버를 나타낸다.
예제:
아래에 보면 클래스 내부에 또 하나의 클래스 (nested class) 가 있는 것을 볼 수 있다.
class A {
class B
def f(b: B) = println("Got my B!")
}아래와 같이 시도해보면
scala> val a1 = new A
a1: A = A@2fa8ecf4
scala> val a2 = new A
a2: A = A@4bed4c8
scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
found : a1.B
required: a2.B
a2.f(new a1.B)
^클래스 내부의 클래스를 정의하는데 A.B 는 안되며, a1.B 와 a2.B 로 정의하는데, 보는 바와 같이 a1 과 a2 각각 가지고있는 class B 는 동일하지 않다.
여기서 # 의 쓰임새가 나오는데 # 은 다른 nested 클래스에 대한 참조를 할 수 있도록 만들어준다.
A.B 아닌 A#B 로 말이다. 이것의 의미는 아무 A 기반의 인스턴스 내의 B 클래스를 말한다.
다시 만들어서 시도해보면
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}scala> val a1 = new A
a1: A = A@1497b7b1
scala> val a2 = new A
a2: A = A@2607c28c
scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
found : a1.B
required: a2.B
a2.f(new a1.B)
^
scala> a2.g(new a1.B)
Got a B.잘된다.
참고)
http://stackoverflow.com/questions/9443004/what-does-the-operator-mean-in-scala
'Scala' 카테고리의 다른 글
| 스칼라 강좌 (32) -타입기초/ 타입별칭 /추상 타입/ 타입 경계 / 변성 (0) | 2016.12.07 |
|---|---|
| 스칼라 강좌 (31) - 스칼라에서 사용되는 심볼들 (0) | 2016.12.07 |
| 스칼라 강좌 (29) - for comprehensions (0) | 2016.11.12 |
| 스칼라 강좌 (28) - Currying(커링) (0) | 2016.11.08 |
| 스칼라 강좌 (27) - 모나드 (Monad) (0) | 2016.11.08 |