Scala hat keine Typklassen, und in diesem Fall können Sie nicht einmal die Typklasse mit einer vererbten Eigenschaft simulieren, da Eigenschaften nur Methoden für ein Objekt ausdrücken, was bedeutet, dass sie "gehört" werden müssen Eine Klasse, also kann man nicht die Definition eines "Konstruktors, der eine Zeichenkette als einziges Argument nimmt" (was "lesen" in OOP-Sprachen genannt wird) in ein Merkmal einfügen.
Stattdessen müssen Sie selbst Typklassen simulieren. Das ist wie so (entspricht Haskell Code in den Kommentaren) getan:
// class Read a where read :: String -> a
trait Read[A] { def read(s: String): A }
// instance Read Person where read = ... parser for Person ...
implicit object ReadPerson extends Read[Person] {
def read(s: String): Person = ... parser for Person ...
}
Dann, wenn Sie eine Methode, die auf dem Typenklasse abhängt, müssen Sie es als implizite Kontext angeben:
// readList :: Read a => [String] -> [a]
// readList ss = map read ss
def readList[A: Read] (ss: List[String]): List[A] = {
val r = implicitly[Read[A]] // Get the class instance of Read for type A
ss.map(r.read _)
}
der Benutzer möchte wahrscheinlich eine polymorphe Methode, wie dies für einfache Bedienung:
object read {
def apply[A: Read](s: String): A = implicitly[Read[A]].read(s)
}
Dann kann man nur schreiben:
val person: Person = read[Person]("Person(Bob,42)")
Ich kenne insbesondere keine Standardimplementierung (en) für diese Typklasse.
Auch ein Disclaimer: Ich habe keinen Scala-Compiler und habe die Sprache seit Jahren nicht mehr benutzt, daher kann ich nicht garantieren, dass dieser Code kompiliert wird.
Ich finde die einzigen heutigen nützlichen Antworten unten, sind die neueren Beschreibungen von Beiz-Scala-Bibliotheken: [die Scala-Beizbibliothek] (http://stackoverflow.com/a/23610675/1509695) und [uPickle] (http://stackoverflow.com/a/28173416/1509695). – matanster