- ベストアンサー
Javaでのifブロック内の変数スコープについて
- Javaのifブロック内での変数スコープについて質問があります。ポケットPC用のプログラムを作成していますが、ポケットPCとそれ以外で使用するクラスが異なるため、if文を使用して適切なクラスを選択しています。
- コーディング時にエラーが発生しており、変数g2がifブロック以降で適用されていないためだと考えています。非効率な解決策として、ifブロック外で変数g2を宣言し、if文内でキャストする方法も試しましたが、ポケットPCの場合にキャストできないという問題が発生しました。
- このような場合、どのように対処しているかご意見をいただきたいです。他の開発者はどのような方法を取っているのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
変更後のg2 = (Graphics)g;がエラーになるのはJavaの型システム上当然です。この場合、変数g2に代入できるのはGraphics2Dクラス(またはそのサブクラス)のオブジェクトだけなので。 一方、変更前のコードのGraphics g2 = (Graphics2D)g;には意味がありません。 変数g2に対してメソッドを呼ぶことができるかどうかは変数の型で決まるので、g2に対して呼べるのはGraphicsクラスで宣言されているメソッド(およびそれをGraphics2Dクラスでオーバーライドしたもの)だけだけです。 上記のようなキャストをしても、g2に対してGraphics2Dにしかないメソッド(たとえばrotate())を呼ぼうとするとコンパイル時にエラーになります。 もしポケットPCでない場合にGraphics2D固有のメソッドを呼びたいのであれば、結局ポケットPCの場合とそうでない場合でコードを分けて書く必要が生じます。 こんな風になります。変数g2は使っていません。 protected void paintComponent(Graphics g) { g.drawImage(im, 0, 0, 480, 640, this); // GraphicsとGraphics2Dで共通のメソッド if (ポケットPCではない) { ((Graphics2D)g).rotate(1.0); // Graphics2D固有のメソッド } g.drawLine(); // GraphicsとGraphics2Dで共通のメソッド : (省略) : }
その他の回答 (2)
- mamacyclist
- ベストアンサー率40% (2/5)
Graphics2Dクラスの継承図は下記となっています。 java.lang.Object └java.awt.Graphics └java.awt.Graphics2D Graphics2Dクラスは Graphicsを継承しています。 なので Graphics2Dのインスタンスを上位クラスのGraphicsにキャストは 可能ですが 逆に Graphics のインスタンスを Graphics2Dにキャストは 出来ません。 (∵Graphics2Dクラスで拡張されている機能をGraphicsクラスは知り得ません) つまり 下記メソッドの引数 Graphics g から Graphics2Dクラス キャストに失敗した原因は gの実体が Graphics2Dクラスのものでは なかったという事です。 protected void paintComponent(Graphics g)
お礼
回答ありがとうございます。 私の質問べたが原因で、本来の質問を取り違われている様です。 言いたかったことは g2.drawImage(im, 0, 0, 480, 640, this); : (省略) : の部分は、パソコンでもポケットPCでもほぼ共通なので、 「変数を共通化して1回の記述で済ませたい。すると何らかの 修正が発生した時でも1ケ所の修正で済む。でも出来ない。」 と言う点です。 その障壁となっているのがifブロック内の変数スコープでして 皆さんはどう対応しているのかな? と聞きたかったのです。 説明べたですみません。 Graphics2DがGraphicsを継承しているという点は勉強になりました。 ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
もともとの (上の) プログラムでは Graphics g2 としているのに, なぜ書き換えた (下の) プログラムでは Graphics2D g2 なんでしょうか.
お礼
回答ありがとうございます。 ちょっと質問が変で申し訳ありません。言いたかったことは g2.drawImage(im, 0, 0, 480, 640, this); : (省略) : の部分は、パソコンでもポケットPCでもほぼ共通なので、 「変数を共通化して1回の記述で済ませたい。すると何らかの 修正が発生した時でも1ケ所の修正で済む。でも出来ない。」 と言う点です。 その障壁となっているのがifブロック内の変数スコープでして 皆さんはどう対応しているのかな? と聞きたかったのです。 説明べたですみません。 変数g2がGraphicsだとかGraphics2Dだとかと言うことは、java 初心者なのでという事でご容赦ください。 ありがとうございました。
お礼
回答ありがとうございます。 なるほど、確かにそうですね。Graphics2D固有の部分だけをif文で 切り分ければ良かったですね。多分、「変数g2を使う」と固執した為に それに気づかなかったのだと思います。 またGraphics2DがGraphicsを継承している点も勉強になりました。 ありがとうございました。