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?

War es hilfreich?

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()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top