Scalaで変数をキャストするにはどうすればよいですか?


199

typeの変数が与えられた場合、GraphicsそれをGraphics2DScala でどのようにキャストできますか?

回答:


282

推奨される手法は、パターンマッチングを使用することです。これにより、問題の値が指定されたタイプではない場合を適切に処理できます。

g match {
  case g2: Graphics2D => g2
  case _ => throw new ClassCastException
}

このブロックはasInstanceOf[Graphics2D]メソッドのセマンティクスを複製しますが、柔軟性が高くなります。たとえば、さまざまなタイプに異なるブランチを提供して、複数の条件付きキャストを同時に効果的に実行できます。最後に、本当にキャッチオールエリアで例外をスローする必要ありませんまた、返すこともnull(できればNone)、またはなしで機能するフォールバックブランチを入力することもできますGraphics2D

要するに、これは本当に進むべき道です。構文よりも少しかさばりasInstanceOfますが、追加された柔軟性はほとんどの場合価値があります。


19
興味深いので+1ですが、このシナリオでは少し多すぎます。ね?
横田ユージーン

既にパターンマッチしているがキャストされた値への参照を失った場合:<code> base match {case MyConcrete(value)=> base.asInstanceOf [MyConcrete] .something(value)} </ code>、 'を取得する方法があります「case MyConcrete(value)」によって実行される「unapply」呼び出しを利用して「value」を抽出したい場合でも、baseはMyConcreteにキャストされますか?
ithkuil 2010

4
これを試してください。base match { case base @ MyConcrete(value) => base.something(value) } 明らかに、シャドウイングbaseはオプションです。簡単に別の変数名を使用することもできます。
Daniel Spiewak、2010

取得できないのは、このパターンマッチングの結果を変数にどのように取得するかです。String a =(String)b;の場合、Javaのようになります。scalaで同等のものは何でしょうか?
ジェームズマクマホン

@JamesMcMahonval gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
ケビンメレディス

224
g.asInstanceOf[Graphics2D];

36
ScalaにasInstanceOf慣れると、静的型システムを使用する目的に反し、気分が悪くなるので、を使用しないことを学びました。
横田ユージン

26
残念ながら、これはSwingを使用する場合の一般的な操作です。カスタム描画操作の場合、「public void paintComponent(Graphics g)」メソッドをオーバーライドする必要があります。Graphicsパラメータは実際にはGraphics2Dインスタンスですが、キャストが必要です。パターンマッチングバージョンは、おそらく保証されているよりも詳細です。覚えておいてください:難読化された難解な過度の冗長性と乱暴さを避けてください!
hohonuuli '16年

7
@hohonuuliその特定のケースではキャストは問題ないと思いますが、scala-swingコンポーネントを使用する場合、paintComponentのパラメーターはすでにGraphics2Dなので、キャストは必要ありません
Luigi Plinge

2
なぜそんなに長いのですか?なぜ「asInstanceOf場合にのみ可能することができます『と』または『asof』キーワードまたは方法あるいはその理由は、従来のものであり、それには大きな問題がないので、彼らはただのオプションとしてC ++やJavaの道を採用しなかった?
レミュエルアダネ2014年

16
@LemuelAdaneキャストを使用しているという事実はコードのにおいであり、簡単にすることは意味がありません。
Daenyth、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.