2009-05-31 9 views

Respuesta

276

La técnica preferida es utilizar la coincidencia de patrones. Esto le permite controlar correctamente el caso de que el valor en cuestión es no del tipo dado:

g match { 
    case g2: Graphics2D => g2 
    case _ => throw new ClassCastException 
} 

Este bloque se replica la semántica del método asInstanceOf[Graphics2D], pero con mayor flexibilidad. Por ejemplo, podría proporcionar diferentes ramas para varios tipos, realizando de manera efectiva múltiples moldes condicionales al mismo tiempo. Finalmente, no necesita realmente necesita lanzar una excepción en el área de catch-all, también puede devolver null (o preferiblemente, None), o puede ingresar alguna rama de reserva que funciona sin Graphics2D.

En resumen, este es realmente el camino a seguir. Es un poco más sintácticamente voluminoso que asInstanceOf, pero la flexibilidad añadida casi siempre vale la pena.

+19

+1 porque es interesante, pero demasiado para este escenario. ¿No es así? –

+0

¿Qué pasa si yo ya emparejado, pero perdió la referencia al valor de conversión: base match { case MyConcrete(value) => base.asInstanceOf[MyConcrete].something(value) }, ¿hay alguna forma de obtener 'base' para MyConcrete incluso si desea extraer el "valor" explotando la llamada 'de aplicación' realizada por "caso MyConcrete (valor)"? – ithkuil

+4

Intenta esto: 'base match {case base @ MyConcrete (value) => base.something (value)}' Obviamente, shadowing 'base' es opcional. Podrías usar fácilmente un nombre de variable diferente. –

215
g.asInstanceOf[Graphics2D]; 
+34

Una vez que me acostumbré a Scala, aprendí a no utilizar 'asInstanceOf', ya que se frustra el propósito de tener un sistema de tipo estático y se siente asqueroso. –

+24

Desafortunadamente, esta es una operación común cuando se usa Swing. Para las operaciones de pintura personalizadas, debe anular el método 'public void paintComponent (Graphics g)'. El parámetro Graphics es en realidad una instancia de Graphics2D, pero se necesita un molde. La versión de coincidencia de patrones es probablemente más detallada que garantizada. Recuerde: ¡evite severamente la hipervergencia y la prolijidad ofuscantes! – hohonuuli

+7

@hohonuuli Creo que el yeso está bien en ese caso específico, pero si usa los componentes 'scala-swing', el parámetro de paintComponent ya es Graphics2D, por lo que no es necesario el molde –

Cuestiones relacionadas