Ich versuche, eine Scala-Funktion zu implementieren, die userFor
ähnlich ist, wie in dem folgenden Codefragment gezeigt, wobei der Rückgabetyp der Funktion vom Typ des Eingabeparameters abhängt. In diesem Beispiel meldet der Scala-Compiler "Der Ausdruck vom Typ System1User.type
entspricht nicht dem erwarteten Typ SystemUser[S]
".Zurückgegebenes Objekt basierend auf dem Eingabetyp
Gibt es eine Möglichkeit, eine Factory-Methode wie userFor
zu erstellen, die den Kompilierzeittyp der Eingabe verwendet, um den richtigen Ausgabetyp zurückzugeben?
sealed trait System {
def name: String
}
case object System1 extends System { def name = "1" }
case object System2 extends System { def name = "2" }
sealed trait SystemUser[S <: System] {
def use(s: S): String
}
object System1User extends SystemUser[System1.type] {
override def use(s: System1.type) = s"${s.name} is in use"
}
object System2User extends SystemUser[System2.type] {
override def use(s: System2.type) = s"${s.name} is in use"
}
object SystemUser {
//TODO: how to make the types work out here?
def userFor[S <: System](sys: S): SystemUser[S] = {
sys match {
case System1 => System1User
case System2 => System2User
}
}
}
diese beantwortet wird? – slouc