# Class Casting: Graphics/Graphics2D



## palador (14. Aug 2009)

Die meisten kennen ja die Klassen _java.awt.Graphics_ und _java.awt.Graphics2D_.
Nun steht in der API zu Graphics: "Direct Known Subclasses: Graphics2D" und zu Graphics2D: "public abstract class Graphics2D extends Graphics".

Meine Frage bezieht sich auf:

```
Graphics2D g2d = (Graphics2D)g; //g ist vom Typ Graphics
```
Das ich ein Graphics2D-Object zu einem normalen Graphics runtercasten kann verstehe ich. Warum ist das hier andersrum möglich? Und wie kann ich sowas implementieren?


----------



## Der Müde Joe (14. Aug 2009)

>Und wie kann ich sowas implementieren? 

Kein Problem, solange du garantierst das die CharSequence ein String oder eine Subklasse davon ist (ja ich weiss, String ist final)


```
public class Test {

	public static void main(String[] args) throws Exception {
		CharSequence seq = new String("hallo");
		foo(seq);
	}

	public static void foo(CharSequence seq) {
		String s = (String) seq;
		System.out.println(s);
	}
}
```


----------



## Aske (14. Aug 2009)

Der Grund hierfür liegt darin, daß SUN einfach gesagt hat, daß alle Graphics Objekte (ab Java 1.2) eine Unterklasse von Graphics2d sind. Sowas ist natürlich die Ausnahme. Zumindest haben sich die Leute im Sun Forum darauf geeinigt ^^

Java 2D - Casting Graphics to Graphics2D objects


----------



## palador (14. Aug 2009)

Ahh, alles klar. Also übergibt das Swingframework mir bei z.B. paintComponent(...) ein Graphics2D objekt, was ich wieder hochcasten kann. Also vom 'castflow' sowas:

```
Graphics2D = (Graphics2D)((Graphics) new Graphics2D);
```


----------



## Der Müde Joe (14. Aug 2009)

Graphics2D ist abstract....also nix mit new....

>Also übergibt das Swingframework mir bei z.B. paintComponent(...) ein Graphics2D Objekt

Eine Subklasse davon. könnest ja den Degugger anwerfen, dann siehst du was da durchflutscht.
Da Graphics2D ; Gaphics erweitert, ist ja G2D vom Typ Graphics und somit auch alle Subklassen von G2S. Da G2D abstract ist muss also eine Subklasse von ihr kommen.
[edit] Dies ist per Definition so und eigentlich recht gefährlich (den cast meine ich) [/edit]

EDIT:
bei mir:
sun.java2d.SunGraphics2D


----------



## palador (14. Aug 2009)

Man muss halt davon ausgehen, dass einem das Framework den richtigen Typ übergibt. Bei mir ist das übrigens auch SunGraphics2D.

Aber warum haben die nicht die neuen Methoden von Graphics2D in Graphics reingetan?
Ist eine .class mit einer anderen .class austauschbar, wenn sie gleich sind nur das die neue .class mehr methoden hat und bestehende anders implementiert sind?


----------



## Der Müde Joe (14. Aug 2009)

Backward compatibility

(siehe auch Vector, Hashtable, StringTokenizer, ....)


----------



## palador (14. Aug 2009)

Was ich meine, hätten sie die Klasse nicht einfach austauschen können? Gegen die gleiche, (gleicher name, methoden, felder usw. - alles außer private-zeug) nur mit neuen Methoden? Gesetzt der Fall meine API bietet folgende Klasse als .class, von mir aus in einem .jar, an:

```
public class Juri {

	public void huhu() {...}

}
```

Jetzt bringe ich eine neue Version raus, wo ich in dieser Klasse neue Methoden reingebaut habe, die alten sind aber alle noch genau so da:

```
public class Juri {

	public void huhu() {...}

	public boolean isRealRussian{...}

}
```

Wenn der Entwickler der schon die alte Version benutzt hat, die neue Lädt, wär die neue Version dann nicht kompatibel? Wenn er immer huhu() angesprochen hat - ist ja noch da und isRealRussian() hätte er ja nie aufrufen können, gabs ja nie. Dafür kann er es jetzt.
Worauf ich hinaus will... hätten die Java-AWT/Swing/whatever-Entwickler nicht einfach die bestehende Graphicsklasse um die neuen Methoden erweitern können, anstatt eine neue zu entwickeln, die man wieder runtercasten muss um an die neuen Funktionen zu kommen.


----------

