2016-12-20 6 views
4

私はジェネリックでパス依存型を使用しようとしています。Scalaでは、複数のパラメータを同じ型の型にする必要があります。

私は2つのクラスを持っていますが、クラスC2はC1に入れ子になっています。

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

そして、私はここで、クラスC1の2つのオブジェクトがあります:私はタイプC2の複数のパラメータを受け入れる方法を書きたい

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

を。これらのパラメータはすべて、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 

第二1:

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 

これをアーカイブすることはできますか?

答えて

7

あなたはそれを行うことができますが、あなたにもオブジェクト自体を渡す必要があります:

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

print(O1)(O1.C2(1111), O2.C2(2222)) 
関連する問題