Dada uma variável com o tipo Graphics
, como a transmito Graphics2D
no Scala?
199
A técnica preferida é usar a correspondência de padrões. Isso permite que você lide com o caso de que o valor em questão não seja do tipo especificado:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
Este bloco replica a semântica do asInstanceOf[Graphics2D]
método, mas com maior flexibilidade. Por exemplo, você pode fornecer ramificações diferentes para vários tipos, executando efetivamente várias transmissões condicionais ao mesmo tempo. Por fim, você realmente não precisa lançar uma exceção na área catch-all, também pode retornar null
(ou preferencialmente None
) ou inserir um ramo de fallback que funcione sem Graphics2D
.
Em suma, este é realmente o caminho a percorrer. É um pouco mais sintaticamente volumoso do que asInstanceOf
, mas a flexibilidade adicional quase sempre vale a pena.
base match { case base @ MyConcrete(value) => base.something(value) }
obviamente, a sombrabase
é opcional. Você poderia facilmente usar um nome de variável diferente.val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
fonte
asInstanceOf
lo, uma vez que isso derrota o propósito de ter um sistema de tipo estático e parece nojento.scala-swing
componentes, o parâmetro de paintComponent já está Graphics2D de modo nenhum o lançarei necessário