# Generische Datentypen



## molina67es (25. Sep 2007)

Hallo!

Habe mich mit generischen Datentypen beschäftigt, dazu das Openbook „Java ist auch eine Insel“ von Galileo Computing benutzt. Dabei bin ich auf ein Beispiel gestoßen, was ich nicht ganz nachvollziehen kann oder im Buch ist ein Fehler. Wäre euch dankbar, wenn einer oder mehrere mir dabei Helfen würdet dieses Beispiel zu verstehen. Wir haben folgenden generischen Datentyp Box<T> mit der Objektvariable (Eigenschaft) val vom Typ T, worauf eine Getter- und eine Setter-Methode definiert sind:


```
class Box<T> {
   private T val; 
   void setValue( T val ) { this.val = val; }
   T getValue() { return val; }
}
In der main()-Methode werden folgende drei Objekte inkarniert:
Box<String>  stringBox = new Box<String>(); 
Box<Integer> intBox    = new Box<Integer>(); 
Box<Point>   pointBox  = new Box<Point>();
```

Bei den ersten beiden ist der Aufruf der get- und set-Methode sowie die Standardausgabe (println()) kein Problem. Bei dem letzten bekomme ich eine NullPointerException, wenn ich getX() aus der Pointer-Klasse wie folgt aufrufe:
double x = pointBox.getValue().getX();
Für mich scheint es verständlich zu sein, da im gesamten Ablauf kein Point-Objekt inkarniert wurde, weshalb auch getValue() den Null-Pointer zurückgibt. Im Buch steht, das es funktionieren sollte, was ich nicht nachvollziehen kann. Kann mir da jemand helfen? Mein Denkfehler oder des Buchautors Fehler? Vielen Dank für eure Hilfe.

 Grüße, Manuel


----------



## SlaterB (25. Sep 2007)

> Im Buch steht, das es funktionieren sollte, was ich nicht nachvollziehen kann. 

offensichtlich liegt hier der Fehler (in deiner falschen Interpretation) 
und du postest nicht die entsprechende Stelle?


----------



## SlaterB (25. Sep 2007)

ach, das ist ja schnell gefunden von so intelligenten Menschen wie mir (  )



> Das Schöne dabei ist, dass nun alle generischen Eigenschaften mit dem angegebenen Typ durchgeführt werden. Wenn wir etwa aus pointBox mit getValue() auf das Element zugreifen, ist es vom Typ Point:
> 
> double x = pointBox.getValue().getX();


http://www.galileocomputing.de/openbook/javainsel6/javainsel_06_013.htm#Xxx1000978

hier gehts nur darum, dass die Operation getX() sofort erkannt wird,
dass getValue() einen Point liefert ohne casten zu müssen,

von null oder nicht null ist da nicht die Rede, es wird ja auch kein vollständiges Programm gepostet


----------



## molina67es (25. Sep 2007)

Die ensprechende Stelle aus dem Buch ist der Programmauschnitt, welches ich hier geposetet habe. Und, was ist an meiner Interpretation falsch. Bitte um Erklärung? Wenn du das Programmstück nachfolziehst, dann wird doch das Pointer Objekt nicht initialisiert und somit kann nicht darauf zugegriffen werden, weil es eine NullPointerException auslöst. Oder? Wenn der Konstruktor des generischen Datentyps bei Pointer diesen initialisieren würde, dann könnte man später mit der get-Methode zugreifen können ohne Exception. Oder?


----------



## SlaterB (25. Sep 2007)

> Wenn du das Programmstück nachfolziehst, dann wird doch das Pointer Objekt nicht initialisiert und somit kann nicht darauf zugegriffen werden, weil es eine NullPointerException auslöst. Oder?

wie gesagt (vielleicht mein Posting zwischendurch noch nicht gesehen):
a.) ist das in dem Kontext überhaupt nicht betrachtet worden
b.) kann eine Zeile eh kein vollständiges Programm sein,
wo ist die class-Definition, die main oder wenigesten der Aufruf new Box<Point>();?
alles in dieser Zeile nicht da, also kannst du dich strenggenommen auch ganz anders beschweren...

irrelevant,
es geht nur um die generische Rückgabe des richtigen Typs (Point statt Object)

> Wenn der Konstruktor des generischen Datentyps bei Pointer diesen initialisieren würde, dann könnte man später mit der get-Methode zugreifen können ohne Exception. Oder?

theoretisch ja, aber macht nur bedingt Sinn, 
die set-Operation ist zum Setzen des Values vorgesehen,
man muss den Value nicht unbedingt gleich im Konstruktor mitübergeben


----------



## Marco13 (25. Sep 2007)

molina67es hat gesagt.:
			
		

> Hallo!
> ...da im gesamten Ablauf kein Point-Objekt *inkarniert* wurde, ...



Und wenn der Garbage-Collector drüberläuft wird es pulverisiert :lol:


----------



## molina67es (26. Sep 2007)

Hallo! Erstmals möchte ich mich bei euch bedanken für die Versuche mir bei meinem Problem auf die Sprünge zu helfen. Leider bin ich noch nicht so routiniert im posten von Java-Beiträgen. Vielleicht deshalb habe ich mich nicht richtig ausgedrückt bzw. einiges vorausgesetzt, was nicht vorauszusetzen war. Wenn ihr noch nicht genug von mir und meinem Thema habt könnte ihr euch die beiden Java-Klassen die das Problem verursacht haben im Folgenden ansehen. Letzendlich ist es ein Fehler im Buch, wer an der Erklärung interessiert ist kann sich bei mir melden. Nochmals vielen Dank.

An SlaterB: Während ich dir auf dein erstes Posting antwortete, hast du dein zweites gepostet, das ich erst nach dem Absenden meiner Antwort gesehen hatte. Danach hatte ich keine Zeit mehr darauf einzugehen, was ich jetzt tue, indem ich versuche das Problem neu zu Stellen.

An Marco13: Ja, ja! Der Garbage Collector erledigt jeden der nicht schnell genugt auf die "digitalen" Bäume kommt :lol:


----------



## SlaterB (26. Sep 2007)

> könnte ihr euch die beiden Java-Klassen die das Problem verursacht haben im Folgenden ansehen

kommt noch oder wie meinst du das?

> Letzendlich ist es ein Fehler im Buch

das kannst du gerne weiter glauben, Sinn macht es allerdings keinen


----------



## Guest (26. Sep 2007)

Entschuldige, hier die beiden Java-Klassen:

Wir habe folgende Klassen, die zweite enthält die main-Methode:


Box.java


```
class Box<T> {
  private T val; 
  void setValue( T val ) { this.val = val; }
  T getValue() { return val; }
}
```


GenericBoxExample.java (enthält main-Methode)


```
public class GenericBoxExample {

   public static void main(String[] args) {
			
      Box<String> stringBox = new Box<String>();
      Box<Integer> intBox = new Box<Integer>();
      Box<Point> pointBox = new Box<Point>();
		
      stringBox.setValue("Generische Datentypen");
      intBox.setValue(25);
      pointBox.getValue().setLocation(12, 36);
      /* Ausgabe: Exception in thread "main" java.lang.NullPointerException
	        at GenericBoxExample.main(GenericBoxExample.java:11)
      */
     		
      System.out.println(stringBox.getValue()); // Ausgabe: Generische Datentypen; Korrekt
      System.out.println(intBox.getValue()); // Ausgabe: 25; Korrekt
      System.out.println(pointBox.getValue());

   }

}
```


----------



## Der Müde Joe (26. Sep 2007)

pointBox.getValue().setLocation(12, 36); 

der Point in der Box ist noch null....darum kannst du da auch nichts setten..


```
pointBox.setValue(new Point());
pointBox.getValue().setLocation(1,2);
```

sollte reichen um den Point in der Box zu initialisieren


----------



## Murray (26. Sep 2007)

Der Müde Joe hat gesagt.:
			
		

> pointBox.getValue().setLocation(12, 36);
> 
> der Point in der Box ist noch null....darum kannst du da auch nichts setten..
> 
> ...



Das war eigentlich bereits seit dem ersten Post klar - die Diskussion ging eher darum, ob man die Passage im Buch so verstehen kann, dass diese Konstrukt funktionieren müsste.


----------



## jPat (27. Sep 2007)

Nein. Wo nix is, kann nix wachsen!


----------



## Murray (27. Sep 2007)

jPat hat gesagt.:
			
		

> Nein. Wo nix is, kann nix wachsen!


Bitte :?:


----------



## jPat (27. Sep 2007)

Im Buch sind die Beispiele ganz klar getrennt. 

Erst die Klasse,

dann ein Initialisierungsbeispiel,

dann ein Zugriff.

Und: Dieses Konstrukt fuktioniert!

Was du damit anfängst, ist deine persönliche sache. Man kann aus jedem Buch-Beispiel ein "nicht lauffähiges" Beispiel machen. 
Ganz einfach: copy -> paste.


----------



## Murray (27. Sep 2007)

jPat hat gesagt.:
			
		

> Im Buch sind die Beispiele ganz klar getrennt.
> 
> Erst die Klasse,
> 
> ...



Das sehe ich genauso - nur der TE halt nicht.


----------

