Scala Typ alias einschließlich Begleitobjekt [Anfänger]
-
29-09-2019 - |
Frage
Ich möchte eine Art Alias ??schreiben Code zu verkürzen, schön und verkapselt Scala.
Angenommen, ich eine Sammlung bekam, die die Eigenschaft hat, der ist eine Liste von Karten, deren Wert Tupel.
Mein Typ wäre so etwas wie List[Map[Int, (String, String)]]
schreiben, oder etwas mehr generisch wie meine Anwendung es erlaubt. Ich konnte ein übergeordneter Typ für ein Seq[MapLike[Int, Any]]
vorstellen, die fragt, oder was auch immer schwimmt mein Boot, mit konkreten Subklassen präziser zu sein.
Ich würde dann gerne einen Alias ??für diese lange Art schreiben.
class ConcreteClass {
type DataType = List[Map[Int, (String, String)]]
...
}
Ich würde dann gerne ConcreteClass#DataType
verwenden überall, wo ich ein nehmen kann, und verwenden Sie es.
Jetzt nehme ich hinzufügen, eine Funktion
def foo(a : DataType) { ... }
Und ich will es mit einer leeren Liste von außen anzurufen.
Ich kann foo(List())
nennen, aber wenn ich möchte, dass mein zugrunde liegenden Typen ändere andere Art von Seq
zu sein, ich werde kommen müssen zurück und diesen Code zu ändern. Außerdem ist es nicht sehr explizit diese leere Liste als DataType
vorgesehen. Und das Begleitobjekt nicht über die zugehörigen List
Methoden, so dass ich nicht DataType()
oder DataType.empty
aufrufe kann. Das wird noch ärgerlich sein, wenn ich nicht leere Listen müssen, da ich einen wesentlichen Teil dieser langen Art schreiben werden müssen.
Gibt es eine Möglichkeit, Scala fragen kann meine Art als die gleiche Sache, einschließlich Begleitobjekts mit seinem Schöpfer Methoden, im Interesse der Verkürzung Code und Blackboxing es zu verstehen? Oder ein Grund, warum soll ich das nicht in erster Linie tun?
Lösung
Die Antwort war eigentlich ganz einfach:
class ConcreteClass {
type DataType = List[String]
}
object ConcreteClass {
val DataType = List
}
val d = ConcreteClass.DataType.empty
Dies ermöglicht es meinen Code ConcreteClass.DataType zu konstruieren Listen mit allen Methoden in List und wenig Aufwand zu nennen.
Vielen Dank an Oleg für die Einsicht. Seine Antwort ist auch am besten, falls Sie keinen Anruf zu ConcreteClass.DataType Liste delegieren, sondern die Kontrolle genau, was Sie wollen Anrufer ermöglichen, zu tun.
Andere Tipps
Was ist das?
class ConcreteClass {
type DataType = List[String]
}
object DataType {
def apply(): ConcreteClass#DataType = Nil
}
//...
val a = DataType()