Ich versuche, eine implizite Konvertierung von jeder Art (zum Beispiel Int) in einen String zu erstellen ...Vermeidung implizite def Mehrdeutigkeit in Scala
Eine implizite Umwandlung in String bedeutet RichString Methoden (wie umgekehrt) sind nicht verfügbar .
implicit def intToString(i: Int) = String.valueOf(i)
100.toCharArray // => Array[Char] = Array(1, 0, 0)
100.reverse // => error: value reverse is not a member of Int
100.length // => 3
eine implizite Konvertierung zu RichString bedeutet String Methoden (wie ToCharArray)
implicit def intToRichString(i: Int) = new RichString(String.valueOf(i))
100.reverse // => "001"
100.toCharArray // => error: value toCharArray is not a member of Int
100.length // => 3
Verwendung sowohl implizite Konvertierungen bedeutet duplizierten Methoden (wie die Länge) nicht verfügbar sind, ist nicht eindeutig.
implicit def intToString(i: Int) = String.valueOf(i)
implicit def intToRichString(i: Int) = new RichString(String.valueOf(i))
100.toCharArray // => Array[Char] = Array(1, 0, 0)
100.reverse // => "001"
100.length // => both method intToString in object $iw of type
// (Int)java.lang.String and method intToRichString in object
// $iw of type (Int)scala.runtime.RichString are possible
// conversion functions from Int to ?{val length: ?}
So ist es möglich, zu String implizit zu konvertieren und noch alle Streich- und RichString Methoden unterstützen?
Es scheint, dass "suck it up" die beste Option ist. API-Design in Scala ist wesentlich schwieriger als ein API-Consumer. Ich wollte einen Datentyp erstellen, der einen Wert umschließt und dem API-Benutzer ermöglicht, den Datentyp so zu behandeln, als wäre es der Typ des internierten Werts. Z.B. Wenn es ein Int umschließt, behandle das Objekt wie ein int. Stellt sich heraus, das ist zu schwierig. Ich bin angesichts meiner Datentyp Hilfsmethoden geben: Typ T val internedValue: T def s = internedValue.asInstanceOf [Zeichenfolge] i def = internedValue.asInstanceOf [Int] ... etc – Synesso
Bevorzugen '(100: String) .length', da dies typsicher ist, 'asInstanceOf' hingegen nicht. Außerdem ist es hübscher und kürzer. –
Nicht nur das, aber asInstanceOf wird hier nie funktionieren, da es immer nur Downcasting (was hier scheitern muss) und keine implizite Konvertierung starten wird. Mit anderen Worten, '100.asInstanceOf [String] .length' wird immer mit einer' ClassCastException' fehlschlagen. –