2016-12-20 6 views
4

제네릭에서 경로 종속 유형을 사용하려고합니다.스칼라에서 여러 매개 변수가 같은 유형의 유형이어야하는 것을 어떻게 제한 할 수 있습니까?

두 클래스가 있고 클래스 C2는 C1에 중첩되어 있습니다.

case class C1(v1: Int) { 
    case class C2(v2: Int) 
} 

그리고 여기 클래스 C1의 두 가지 목적이 있습니다

object O1 extends C1(1) 
object O2 extends C1(2) 

내가 형 C2의 여러 매개 변수를 허용하는 방법을 쓰고 싶어합니다. 그리고이 모든 매개 변수는 C1의 동일한 객체에 속해야합니다. 예를 들어

는 :

foo(O1.C2(10), O1.C2(11)) // all the C2 is inside the same O1 
foo(O1.C2(10), O2.C2(20)) // not good, will not compile 

나는 방법의이 종류를 작성하는 몇 가지 방법을 시도했다, 그러나 아무도는 작동하지 않습니다.

첫번째 :

def print1(p1: C1#C2, p2: C1#C2): Unit = { 
    println(p1.v2, p2.v2) 
} 
print1(O1.C2(1111), O2.C2(2222)) // Not requited that p1 & p2 should have the same object of C1 

두번째 :

def print2(p1: O1.C2, p2: O1.C2): Unit = { 
    println(p1.v2, p2.v2) 
} 
print2(O1.C2(1111), O1.C2(1111)) // Can only accept the C2 inside O1 

세번째 :

def print3[T <: C1#C2](p1: T, p2: T): Unit = { 
    println(p1.v2, p2.v2) 
} 
print3(O1.C2(1111), O2.C2(2222)) // The same as the first one. 

마지막 :

// def print2[U <: C1](p1: U.C2, p2: U.C2): Unit = { 
// println(p1.v2, p2.v2) 
// } 
// Not compile, Error: not found: value U 
,536,

어쨌든 이것을 보관할 수 있습니까?

답변

7

당신은 그것을 할 수 있지만, 당신은뿐만 아니라 객체 자체를 전달해야

def print(o: C1)(p1: o.C2, p2: o.C2) = ... 

print(O1)(O1.C2(1111), O2.C2(2222))