Non mi piacciono i metodi Scala isInstanceOf e asInstanceOf: sono lunghi e asInstanceOf può generare eccezioni, quindi è necessario utilizzarlo in coppia. Il modo migliore è utilizzare la corrispondenza dei modelli: Scala: How do I cast a variable? ma per operazioni davvero semplici può essere anche relativamente lungo. In C# abbiamo operatori 'is' e 'as' quindi volevo implementare la definizione implicita con questo in Scala. Il mio codice simile a questa:Operatore per il cast di tipo short e type safe
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)
ha un vantaggio - implementare modello null-oggetto, ma anche svantaggi:
bisogno di utilizzare classOf operatore [T] - è troppo lungo
testa collegata con def implicita per tale operazione semplice
così la non è una ragione pratica per usarlo. Mi piacerebbe sapere c'è un modo per implementarlo senza dover usare classOf [T]?
A mio parere, è un bene that' isInstanceOf' e 'asInstanceOf' hanno nomi relativamente lunghi e scomodi. Normalmente vorrai evitare il controllo dinamico dei tipi e il cast e usare un approccio migliore stile OO (polimorfismo) o pattern matching (stile funzionale). I nomi scomodi ti incoraggiano a non usarli troppo. Nel tuo titolo stai chiedendo un "tipo di operatore cast sicuro". Il casting non è mai sicuro, per definizione. – Jesper
Suppongo che ci sarà un commento simile. In generale sono d'accordo con te sul fatto che un buon design e l'abbinamento di modelli sono molto migliori. Ma a volte IMHO 'come' notazione è molto più breve e più chiara. Ad esempio, possiamo utilizzare la libreria di terze parti in cui il design non è buono come abbiamo bisogno. Restituisce anche Option [T] invece T così è più sicuro. E alla fine: rispondere a questa domanda mi dà più informazioni su Scala :) – theres