4

Graphics インスタンスを Graphics2D インスタンスにダウンキャストできる理由を理解しようとしています。

通常、ターゲットの型を継承していない参照型をダウンキャストすることは規則に反します。

グラフィック指向のクラスでは、階層は次のようになります。

  1. グラフィックスはスーパークラスです
  2. Graphics2D は、スーパークラス Graphics のサブクラスです。

Swing で何かを描画するときは、paint() メソッドをオーバーライドします。2D 描画が必要な場合は、自動的に提供される Graphics インスタンスを paint() メソッドから Graphics2D インスタンスにダウンキャストします。

public void paint(Graphics g)
{
    super.paint(g);

    Graphics2D g2d = (Graphics2D)g;
}

でもこれは逆?Graphics インスタンスは、graphics2D インスタンスを継承していません-クラス階層を見ると、Graphics インスタンスを継承しているのはGraphics2Dインスタンスです!

なぜこれが許可されているのですか?

4

7 に答える 7

3

g実行時に実際に Graphics2D のインスタンスになることがわかっている場合は許可されます。そうでない場合は、ClassCastException実行時に を取得します。

のドキュメントを確認すると、とGraphicsの既知のサブクラスは 2 つだけであることがわかります。したがって、サブクラスのカスタム実装を除いて、インスタンスを扱っていることはほぼ確実です。GraphicsGraphics2DDebugGraphicsGraphicsGraphics2D

于 2013-07-11T19:41:59.960 に答える
3

Graphics2Dは、「人間」が「二足歩行」のクラスであるのと同じように、から継承するGraphicsクラスです。すべての人間が二足歩行であることは事実ですが、すべての二足歩行者が人間であるとは限りません。

java.awt.GraphicsJava の初期の時代にさかのぼり、あまり洗練されたものではありませんでした。Waphen Swing と Java2D が作成され、古いコードが機能するようGraphics2Dに のサブクラスとして作成されました。下位Graphics互換性は Sun の宗教でした (悪いものではありませんでした)。

JComponentおよび他の Swing クラスjava.awt.Componentは、古い API を使用していた を継承しています。スーパークラス以外に変更を加えずに AWT から Swing に簡単に移行できるようにするために、SwingGraphicsGraphics2D.

Swing では、 に渡される Graphicspaint(Graphics)は常に であることが十分に文書化されているGraphics2Dため、そうでない場合を処理するための代替コードパスは必要ありません。

于 2013-07-12T00:56:18.340 に答える
1

混乱しGraphicsているのは Graphics2D のスーパークラスです。instanceofダウンキャストすることはできますが、実行時例外を回避するためにダウンキャストを使用する方が危険ですClassCastException

また、代わりにpaintオーバーライドが必要ない場合はオーバーライドしないでくださいpaintComponent

于 2013-07-11T19:54:07.730 に答える
1

Graphics は Graphics2D のスーパークラスです。このキャストが必要な理由については、よくわかりません。それも私を悩ませているものです。

編集:

これをチェックしてください:

Graphics2D は JDK 1.1 の後に導入されました。レガシー プログラムとの下位互換性を維持するために、ダウンキャストGraphicsする必要があると思います。Graphics2D

より高度な機能にアクセスしたい場合は、Graphics2D にキャストします。これはベスト プラクティスに反しますが、後方互換性を維持するためにはおそらく価値があると考えられていました。

于 2013-07-11T19:40:39.083 に答える
1

paint メソッドに渡されるオブジェクトは、Graphics2D 型です。メソッド シグネチャで明示的ではありませんが、プログラマーはこのことを知っています (一般に真である必要はないため)。したがって、オブジェクトをキャストできます。

于 2013-07-11T19:43:12.267 に答える