2016-12-20 2 views
4

Ich versuche, pfadabhängigen Typ mit Generika zu verwenden.In Scala, wie kann ich mehrere Parameter einschränken muss ein Typ innerhalb des gleichen Typs sein?

Ich habe zwei Klassen, die Klasse C2 ist in C1 verschachtelt.

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

Und ich habe zwei Objekt der Klasse C1 hier:

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

Ich möchte ein Verfahren schreiben, die mehrere Parameter des Typs C2 akzeptieren. Und alle diese Parameter müssen zum selben Objekt von C1 gehören.

Zum Beispiel:

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 

Ich habe einige Möglichkeiten versucht, diese Art von Methode zu schreiben, aber niemand arbeitet.

Die erste:

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 

Die zweite:

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 

Der dritte:

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. 

Der letzte:

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

Kann ich das überhaupt archivieren?

Antwort

7

Sie können es tun, aber Sie müssen das Objekt selbst, als auch weitergeben müssen:

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

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