Étant donné une variable de type Graphics
, comment la convertir Graphics2D
en Scala?
La technique préférée consiste à utiliser la correspondance de motifs. Cela vous permet de gérer avec élégance le cas où la valeur en question n'est pas du type donné:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
Ce bloc reproduit la sémantique de la asInstanceOf[Graphics2D]
méthode, mais avec une plus grande flexibilité. Par exemple, vous pouvez fournir différentes branches pour différents types, en effectuant efficacement plusieurs conversions conditionnelles en même temps. Enfin, vous n'avez pas vraiment besoin de lever une exception dans la zone fourre-tout, vous pouvez également retourner null
(ou de préférence, None
), ou vous pouvez entrer une branche de secours qui fonctionne sans Graphics2D
.
Bref, c'est vraiment la voie à suivre. C'est un peu plus encombrant syntaxiquement que asInstanceOf
, mais la flexibilité supplémentaire en vaut presque toujours la peine.
base match { case base @ MyConcrete(value) => base.something(value) }
toute évidence, l'observationbase
est facultative. Vous pouvez tout aussi bien utiliser un nom de variable différent.val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
la source
asInstanceOf
, car il va à l'encontre du but d'avoir un système de type statique et se sent dégoûtant.scala-swing
composants, le paramètre de paintComponent est déjà Graphics2D donc aucune distribution n'est requise