Учитывая переменную с типом Graphics
, как я могу привести ее Graphics2D
в Scala?
Учитывая переменную с типом Graphics
, как я могу привести ее Graphics2D
в Scala?
Ответы:
Предпочтительным методом является использование сопоставления с образцом. Это позволяет изящно обрабатывать случай, когда рассматриваемое значение не относится к данному типу:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
Этот блок копирует семантику asInstanceOf[Graphics2D]
метода, но с большей гибкостью. Например, вы можете предоставить разные ветви для разных типов, эффективно выполняя несколько условных приведений одновременно. И, наконец, вы не на самом деле нужны , чтобы бросить исключение в броской всей области, вы могли бы также вернуться null
(или , предпочтительно, None
), или вы могли бы ввести некоторую резервную ветвь , которая работает без Graphics2D
.
Короче говоря, это действительно путь. Это немного более синтаксически громоздко asInstanceOf
, но дополнительная гибкость почти всегда стоит того.
base match { case base @ MyConcrete(value) => base.something(value) }
Очевидно, теневое копирование base
необязательно. Вы также можете легко использовать другое имя переменной.
val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
g.asInstanceOf[Graphics2D];
asInstanceOf
, так как это побеждает цель иметь статическую систему типов и кажется отвратительным.
scala-swing
компоненты, параметром paintComponent уже является Graphics2D, так что приведение не требуется