回答:
推奨される手法は、パターンマッチングを使用することです。これにより、問題の値が指定されたタイプではない場合を適切に処理できます。
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なので、キャストは必要ありません