Étant donné une variable de type Graphics
, comment la convertir en Graphics2D
dans Scala?Comment convertir une variable dans Scala?
Répondre
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.
g.asInstanceOf[Graphics2D];
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. –
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
@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 –
- 1. Comment convertir une variable en chaîne?
- 2. Comment convertir implicitement Tuples en vectoriel dans Scala
- 3. Dans GNU Make, comment convertir une variable en minuscule?
- 4. Comment copier une liste dans Scala
- 5. Comment imprimer une carte dans Scala
- 6. Comment exécuter une fonction dans Scala
- 7. Comment convertir un fichier java.util.Map en Scala Map
- 8. Comment convertir un Iterable Java en Scala Iterable?
- 9. Python: Comment convertir une variable NonType en String?
- 10. Est-il possible de convertir une variable en type stocké dans une autre variable?
- 11. Scala: comment fusionner une collection de cartes
- 12. Convertir une variable en un type représenté par une autre variable Type?
- 13. Convertir une variable à virgule flottante en entier?
- 14. Pouvez-vous retourner une fonction non évaluée dans scala?
- 15. Ruby - convertir du symbole à la variable
- 16. Scala: Comment "stocker" une fonction dans un var?
- 17. Initialisation de variables génériques dans Scala
- 18. Comment trier un tableau dans Scala?
- 19. Ruby on Rails - Variable dans une variable
- 20. Programmation de paramètres répétés dans Scala
- 21. Traitement simultané dans Scala
- 22. Comment vider une variable dans JSP?
- 23. en utilisant une variable dans: contient - comment
- 24. Comment renvoyer une variable GET dans Rails?
- 25. comment insérer une URL/variable dans onclick?
- 26. SQL - Comment assigner un enregistrement dans une variable
- 27. Comment faire une variable "opérateur"? (C++)
- 28. comment affecter une variable javascript à une variable smarty
- 29. Comment analyser une variable Javascript
- 30. Comment capturer une variable (C#)
+1 parce que c'est intéressant, mais un peu trop pour ce scénario, n'est-ce pas? –
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)"? – ithkuilEssayez 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 –