Generische Datentypen

Status
Nicht offen für weitere Antworten.

molina67es

Mitglied
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:

Code:
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
 
> 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?
 
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
 
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?
 
> 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
 
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:
 
> 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 😉
 
Entschuldige, hier die beiden Java-Klassen:

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


Box.java

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


GenericBoxExample.java (enthält main-Methode)

Code:
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());

   }

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

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

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

sollte reichen um den Point in der Box zu initialisieren
 
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..

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

sollte reichen um den Point in der Box zu initialisieren

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.
 
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. 😉
 
jPat hat gesagt.:
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. 😉

Das sehe ich genauso - nur der TE halt nicht.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben