2012-01-25 7 views
3

Graphics2DGraphicsのすべてが含まれていると、なぜデフォルトにならないのですか?Graphics2D
ほとんどすべての私の絵画のオーバーライドでGraphics2Dオブジェクトをキャスト/作成するようです。Swingはなぜ 'Graphics2D'ではなく、デフォルトの 'Graphics'ですか?

@Override 
public void paintComponent(Graphics paramGraphics){ 
    super.paintComponent(paramGraphics); 
    Graphics2D g = (Graphics2D) paramGraphics.create(); 
    // RenderingHints etc. 
} 
+0

すべてのGraphicsが実際にGraphics2Dであるとは限りません。はい、そうです、あなたがスクリーンに描いていると思っていますが、印刷している場合は常にそうではないかもしれません。 –

答えて

3

GraphicsのみをサポートするAWTとの互換性。 Swingのコンポーネントはjava.awt.Componentに拡張され、getGraphicsメソッドはGraphicsオブジェクトのみを返します。 Swingが作成されたとき(Java 1.1/1.2)、Javaは共分散を知らなかった。戻り値の型がメソッドのシグニチャーの一部でない場合でも、異なる(元のサブクラス)戻り型のオーバーライドされたメソッドは許可されませんでした。今日の言語機能では、これは許され、多分実行されるでしょう。すなわち戻り値のタイプはGraphics2Dに変更されます。当時、唯一の方法は、(getGraphics2Dのような)新しいメソッドを追加するか、AWTとの容易な相互運用性を完全に破ることでした。

+0

1.7でも、contravariantパラメータを使うことはできません。これは恐らく最もよく見られる(1D?) 'Graphics'です。より具体的な戻り値の型については、 'create2D'などがこのトリックを実行した可能性があります。 –

関連する問題