Dada una variable con tipo Graphics
, ¿cómo la Graphics2D
convierto en Scala?
La técnica preferida es utilizar la coincidencia de patrones. Esto le permite manejar con gracia el caso de que el valor en cuestión no sea del tipo dado:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
Este bloque reproduce la semántica del asInstanceOf[Graphics2D]
método, pero con mayor flexibilidad. Por ejemplo, podría proporcionar diferentes ramas para varios tipos, realizando efectivamente múltiples lanzamientos condicionales al mismo tiempo. Finalmente, realmente no necesita lanzar una excepción en el área general, también podría regresar null
(o preferiblemente None
), o podría ingresar a alguna rama alternativa que funcione sinGraphics2D
.
En resumen, este es realmente el camino a seguir. Es un poco más sintácticamente voluminoso que asInstanceOf
, pero la flexibilidad adicional casi siempre vale la pena.
base match { case base @ MyConcrete(value) => base.something(value) }
Obviamente, el sombreadobase
es opcional. Podría usar fácilmente un nombre de variable diferente.val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
fuente
asInstanceOf
, ya que frustra el propósito de tener un sistema de tipo estático y se siente asqueroso.scala-swing
componentes, el parámetro de paintComponent ya es Graphics2D, por lo que no se requiere elenco