Data una variabile con tipo Graphics
, come posso eseguirne il cast Graphics2D
in Scala?
Data una variabile con tipo Graphics
, come posso eseguirne il cast Graphics2D
in Scala?
Risposte:
La tecnica preferita è usare la corrispondenza del modello. Ciò consente di gestire con garbo il caso in cui il valore in questione non sia del tipo specificato:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
Questo blocco replica la semantica del asInstanceOf[Graphics2D]
metodo, ma con una maggiore flessibilità. Ad esempio, potresti fornire diversi rami per vari tipi, eseguendo efficacemente più cast condizionali contemporaneamente. Infine, non hai davvero bisogno di lanciare un'eccezione nell'area catch-all, potresti anche tornare null
(o preferibilmente, None
) o potresti entrare in qualche ramo di fallback che funziona senza Graphics2D
.
In breve, questa è davvero la strada da percorrere. È un po 'più sintatticamente ingombrante di asInstanceOf
, ma ne vale quasi sempre la flessibilità aggiuntiva.
base match { case base @ MyConcrete(value) => base.something(value) }
ovviamente l'ombreggiatura base
è facoltativa. Potresti usare altrettanto facilmente un nome di variabile diverso.
val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
g.asInstanceOf[Graphics2D];
asInstanceOf
, dal momento che sconfigge lo scopo di avere un sistema di tipo statico e mi sento fortunato.
scala-swing
componenti, il parametro di paintComponent è già Graphics2D, quindi nessun cast richiesto