• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:java - ifブロック内の変数スコープについて)

Javaでのifブロック内の変数スコープについて

このQ&Aのポイント
  • Javaのifブロック内での変数スコープについて質問があります。ポケットPC用のプログラムを作成していますが、ポケットPCとそれ以外で使用するクラスが異なるため、if文を使用して適切なクラスを選択しています。
  • コーディング時にエラーが発生しており、変数g2がifブロック以降で適用されていないためだと考えています。非効率な解決策として、ifブロック外で変数g2を宣言し、if文内でキャストする方法も試しましたが、ポケットPCの場合にキャストできないという問題が発生しました。
  • このような場合、どのように対処しているかご意見をいただきたいです。他の開発者はどのような方法を取っているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

変更後の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で共通のメソッド    : (省略)    : }

ttomioka
質問者

お礼

回答ありがとうございます。 なるほど、確かにそうですね。Graphics2D固有の部分だけをif文で 切り分ければ良かったですね。多分、「変数g2を使う」と固執した為に それに気づかなかったのだと思います。 またGraphics2DがGraphicsを継承している点も勉強になりました。 ありがとうございました。

その他の回答 (2)

回答No.3

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)

ttomioka
質問者

お礼

回答ありがとうございます。 私の質問べたが原因で、本来の質問を取り違われている様です。 言いたかったことは g2.drawImage(im, 0, 0, 480, 640, this);    : (省略)    : の部分は、パソコンでもポケットPCでもほぼ共通なので、 「変数を共通化して1回の記述で済ませたい。すると何らかの  修正が発生した時でも1ケ所の修正で済む。でも出来ない。」 と言う点です。 その障壁となっているのがifブロック内の変数スコープでして 皆さんはどう対応しているのかな? と聞きたかったのです。 説明べたですみません。 Graphics2DがGraphicsを継承しているという点は勉強になりました。 ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

もともとの (上の) プログラムでは Graphics g2 としているのに, なぜ書き換えた (下の) プログラムでは Graphics2D g2 なんでしょうか.

ttomioka
質問者

お礼

回答ありがとうございます。 ちょっと質問が変で申し訳ありません。言いたかったことは g2.drawImage(im, 0, 0, 480, 640, this);    : (省略)    : の部分は、パソコンでもポケットPCでもほぼ共通なので、 「変数を共通化して1回の記述で済ませたい。すると何らかの  修正が発生した時でも1ケ所の修正で済む。でも出来ない。」 と言う点です。 その障壁となっているのがifブロック内の変数スコープでして 皆さんはどう対応しているのかな? と聞きたかったのです。 説明べたですみません。 変数g2がGraphicsだとかGraphics2Dだとかと言うことは、java 初心者なのでという事でご容赦ください。 ありがとうございました。

関連するQ&A

専門家に質問してみよう