Предпочтительным методом является использование сопоставления с образцом. Это позволяет изящно обрабатывать случай, когда рассматриваемое значение равно , а не данного типа:
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
Этот блок копирует семантику метода asInstanceOf[Graphics2D]
, но с большей гибкостью. Например, вы можете предоставить разные ветви для разных типов, эффективно выполняя несколько условных приведений одновременно. Наконец, вам не нужно действительно создавать исключение в области всеобщего охвата, вы также можете вернуть null
(или, предпочтительно, None
), или вы можете ввести некоторую резервную ветку, которая работает без Graphics2D
.
Короче говоря, это действительно путь. Синтаксически он немного громче, чем asInstanceOf
, но дополнительная гибкость почти всегда стоит.