Ich mag Scala isInstanceOf und asInstanceOf Methoden - sie sind lang und asInstanceOf kann Ausnahme auslösen, so dass wir es paar verwenden müssen. Ein besserer Weg ist der Mustervergleich: Scala: How do I cast a variable?, aber für wirklich einfache Operationen kann es auch relativ lang sein. In C# haben wir 'is' und 'as' Operatoren, also wollte ich implizite Definition damit in Scala implementieren. Mein Code sieht wie folgt aus:Scala kurze und typsichere Cast-Operator
scala> class TypeCast(x:Any){
| def is[T](t:Class[T]) = t.isInstance(x)
| def as[T](t:Class[T]):Option[T] = if(t.isInstance(x)) Option(t.cast(x)) else None
| }
defined class TypeCast
scala> implicit def TypeCastID(x:Any)=new TypeCast(x)
TypeCastID: (x: Any)TypeCast
scala> 123 as classOf[String]
res14: Option[String] = None
scala> "asd" as classOf[String]
res15: Option[String] = Some(asd)
Es hat einen Vorteil - null-Objektmuster implementieren, aber auch Nachteile haben:
brauchen classof [T] Operator verwenden - es ist zu lang
Overhead mit impliziter def verbunden ist, um so einfacher Betrieb
so die Es gibt keinen praktischen Grund, es zu benutzen. Ich würde gerne wissen, gibt es eine Möglichkeit, dies zu implementieren, ohne die Verwendung von classOf [T]?
Meiner Meinung nach zu vermeiden, ist es gut dass 'isInstanceOf' und' asInstanceOf' relativ lange und unbequeme Namen haben. Normalerweise sollten Sie die dynamische Typprüfung und das Casting vermeiden und stattdessen einen besseren OO-Stil-Ansatz (Polymorphismus) oder Mustervergleich (Funktionsstil) verwenden. Die unbequemen Namen ermutigen Sie, sie nicht zu oft zu benutzen. In Ihrem Titel fragen Sie nach einem "Typ Safe Cast Operator". Casting ist per Definition niemals typsicher. – Jesper
Ich vermutete, dass es ähnliche Kommentare geben wird. Im Allgemeinen stimme ich Ihnen zu, dass gutes Design und Mustervergleich viel besser ist. Aber manchmal IMHO 'als' Notation ist viel kürzer und klarer. Zum Beispiel können wir eine Bibliothek von Dritten verwenden, wo das Design nicht so gut ist, wie wir es brauchen. Es gibt auch Option [T] statt T, also ist es sicherer. Und am Ende: Antwort auf diese Frage geben mir vor allem zusätzliches Wissen über Scala :) – theres