2009-05-31 7 views

Répondre

276

La technique préférée consiste à utiliser une correspondance de modèle. Cela vous permet de gérer correctement le cas où la valeur en question est pas du type donné:

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

Ce bloc reproduit la sémantique de la méthode asInstanceOf[Graphics2D], mais avec une plus grande flexibilité. Par exemple, vous pouvez fournir différentes branches pour différents types, en effectuant efficacement plusieurs distributions conditionnelles en même temps. Enfin, vous n'avez pas vraiment besoin de lancer 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.

En bref, c'est vraiment la voie à suivre. C'est un peu plus encombrant syntaxiquement que asInstanceOf, mais la flexibilité ajoutée en vaut presque toujours la peine.

+19

+1 parce que c'est intéressant, mais un peu trop pour ce scénario, n'est-ce pas? –

+0

déjà patternmatched mais perdu la référence à la valeur casted: base match { case MyConcrete(value) => base.asInstanceOf[MyConcrete].something(value) }, y a-t-il un moyen d'obtenir 'base' casté à MyConcrete même si vous voulez extraire "value" en exploitant l'appel 'unsapply' effectué par "case MyConcrete (value)"? – ithkuil

+4

Essayez ceci: 'base match {base base @ MyConcrete (valeur) => base.something (valeur)}' De toute évidence, ombrer 'base' est facultatif.Vous pouvez tout aussi facilement utiliser un nom de variable différent –

215
g.asInstanceOf[Graphics2D]; 
+34

Une fois que je me suis habitué à Scala, j'ai appris à ne pas utiliser 'asInstanceOf', car cela va à l'encontre de l'objectif d'avoir un système de type statique et je me sens malchanceux. –

+24

Malheureusement, ceci est une opération courante lors de l'utilisation de Swing. Pour les opérations de peinture personnalisées, vous devez remplacer la méthode public void paintComponent (Graphics g). Le paramètre Graphics est en fait une occurrence de Graphics2D, mais un cast est nécessaire. La version de correspondance de modèle est probablement plus verbeuse que justifiée. Rappelez-vous: évitez Sedulously hypervolosité obfuscatory et prolixity! – hohonuuli

+7

@hohonuuli Je pense que la distribution est bonne dans ce cas précis, mais si vous utilisez des composants scala-swing, le paramètre de paintComponent est déjà Graphics2D, donc pas besoin de lancer –

Questions connexes