Konstruktor-Aufruf nun mit oder ohne Typ?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

bei meinen ersten Gehversuchen mit Generics bin ich auf folgende Sache gestoßen.

Ich habe mir ein Beispiel definiert (Presse, die Saft aus Früchten pressen kann, die ihrerseits auspressbar sind ;-))


Code:
public class Presse<E extends Fruit & IPressable> {

    public Presse() {
    }

    public void startPressing(E fruit) {
         fruit.press();
    }
}

passende Frucht:
Code:
public class Orange extends Fruit implements IPressable {...}

Das klappt auch toll. Allerdings bin ich über die Konstruktion des Presse-Objekts etwas ins Stutzen gekommen:

Laut meinem Buch müsste es heißen:
Code:
Presse<Orange> p = new Presse<Orange>();
(funktioniert)

Allerdings funktioniert auch:
Code:
Presse<Orange> p = new Presse();

Ich hätte nun gerne gewusst, was richtig ist (Spec gibt's ja leider noch nicht zum Download) - oder ist das irgendwie so ein Bequemlichkeits-Ding?

Danke für Eure Hinweise!

Gruß,

Karl

P.S.: Ich habe extra getestet, ob das Verhalten identisch ist, indem ich versucht habe, in der Orangenpresse eine Zitrone auszupressen - korrekte Fehlermeldung in beiden Fällen, dass Zitronen eben keine Orangen sind ;-).
 
B

Beni

Gast
Das erste ist korrekt, das zweite müsste eine Warnung des Compilers geben.
 

Karl

Aktives Mitglied
Hallo Beni,

Danke!
Für die JDK-1.5-Spielereien habe ich mir neben Eclipse netbeans installiert, weil die 1.5 voll unterstützen.
Vielleicht habe ich da was übersehen, was die Warnungen angeht.

Gruß,

Karl
 
B

bygones

Gast
eclipse unterstützt ab 3.1M3 nahezu auch alle 1.5 features....

zu dem zweiten Bsp. du änderst die parametrisierte Frucht wieder zum RawType, was ansich unsinnig ist, warum dann der Parameter.. Der Compiler spuckt hier dann ein Typ Safety Warnung aus
 
B

bygones

Gast
Status of J2SE 5.0 features
The changes to the Java tools to support J2SE 5.0 (aka 1.5) are coming along nicely. The Eclipse Java compiler now supports the following additional new features of J2SE 5:

* enumerations
* static imports
* varargs

Generics, enhanced for loops, and hexadecimal floating point literals were supported in M2, although the support for generic types has improved significantly since then. The other language additions - annotations and autoboxing - make it past the parser, but are not yet being processed any deeper than that. Support for these other new language features will be introduced in future 3.1 milestones. (As of M3, the Eclipse Java compiler is passing 97.95% of the JCK 1.5 compliance tests, up from 96.8% for M2. Only 223 more tests to go, out of 10863.)

In order to work with any of the new language features you must set the Java project's compiler compliance level to 1.5 (Java Compiler > Compliance and Classfiles > Compiler compliance level > 1.5) and configure the Java build path with the system libraries from an installed 1.5 JRE.
 

Bleiglanz

Gesperrter Benutzer
Presse<Orange> p = new Presse();
Sollte gehen, aber mit der üblichen Warnung, die erste Variante ist natürlich richtig.
oder ist das irgendwie so ein Bequemlichkeits-Ding?
Ja! BTW: das liegt am "Erasure", Presse<Orange> ist zur Laufzeit nichts anderes als Presse; ohne dieses Feature liessen sich bestehende Bibliotheken kaum mit den neuen Generics verwenden:. man soll ja schreiben dürfen
Code:
List<Birnen> = altesLegacyObject.getTheBirnen();
 // gibt java.util.List zurück
 
B

bygones

Gast
trotzdem sind generics weit mehr als ein "Bequemlichkeits-Ding"... das wird zum einen dadurch gedacht, als dass man Generics als reine "Nicht-mehr-Casten-Müssen" Sache ansieht....

einfachstes beispiel ist. Bisher kann es passieren, dass man eine fremde Methode nutzt, die eine Map zurückgibt. Nun liegt es an dir zu schauen, was ist in der map drinnen und damit gefahr zu laufen das ganze programm durch einen ClassCastException scheitern zu lassen...

Mit generics bekommst du nun einen Map<String,List<String>> zurück und somit ist sofort klar was sich in dieser map befindet !!
D.h. die Schnittstellen definitionen werden klarer

(ganz abgesehen von den Template möglichkeiten durch generics)
 

Bleiglanz

Gesperrter Benutzer
@deathbyaclown

ich denke, mit Bequemlichkeitsding war gemeint, dass
Code:
Presse<Orange> p = new Presse();
funktioniert :)

ist aber auch ein Seiteneffekt des Erasure
 

Karl

Aktives Mitglied
Hallo Bleiglanz,

genau, so war's gemeint - und dank Deines Beispiels leuchtet mir die Sache jetzt auch ein ;-)
Der Compiler lässt es hier durchgehen, weil er es bei Legacy-Code ja so oder so dulden muss.

Mein erster Eindruck ist, dass Generics die Probleme von der Laufzeit (bisher dubiose ClassCastExceptions, die man mühsamst debuggen muss) auf die Compile-Zeit verlegt (in Zukunft bei komplexen Konstruktionen "Knobeltime mit eckigen Klammern" ;-)).
Das ist schon ein Vorteil, zumal die Kosten für Fehlerbeseitigung automatisch sinken, je früher er erkannt wird.
An der Komplexität bei verschachtelten Deklarationen kommt man halt nicht vorbei.


Gruß,

Karl
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Konstruktor-Aufruf nur aus einem bestimmten Package erlauben Allgemeine Java-Themen 5
B Parameter Konstruktor plus rechnen Allgemeine Java-Themen 6
M Konstruktor einer Methode Allgemeine Java-Themen 35
M Frage zum Konstruktor Allgemeine Java-Themen 2
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8
J Konstruktor in JSP beim Kompilieren nicht gefunden Allgemeine Java-Themen 3
J Inner class + Leer-Konstruktor Allgemeine Java-Themen 1
P Threads Objekt im Konstruktor anders wie im Run()-Block Allgemeine Java-Themen 10
H Beim Konstruktor "this" Allgemeine Java-Themen 4
K Variablen Konstruktor, unendlich viele Allgemeine Java-Themen 3
T Konstruktor löst exception aus Allgemeine Java-Themen 7
C Klassen und Konstruktor Allgemeine Java-Themen 2
W Threads NullPointer: Konstruktor "zu langsam"? Allgemeine Java-Themen 3
L Klassen Konstruktor soll Objekt anderer Klasse erzeugen Allgemeine Java-Themen 2
M Klassen Klasse Dynamisch laden und Konstruktor aufrufen Allgemeine Java-Themen 1
DStrohma In abstrakter Klasse Konstruktor von Instanz implementieren Allgemeine Java-Themen 11
C Reflektions, Benutzer soll Konstruktor auswählen und Parameter übergeben können Allgemeine Java-Themen 5
S OOP this-Referenz als Konstruktor-Übergabe Allgemeine Java-Themen 8
ruutaiokwu NullPointerException auf member, die per konstruktor gesetzt wird (multithread-kontext) Allgemeine Java-Themen 2
ruutaiokwu auf priv. konstruktor von "aussen" zugreifen? Allgemeine Java-Themen 4
A Methoden laufen im Konstruktor, außerhalb allerdings nicht Allgemeine Java-Themen 2
E Array im Konstruktor übergeben Allgemeine Java-Themen 3
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
X Dynamisch Konstruktor aufrufen Allgemeine Java-Themen 12
J abstrakte Klassen, Konstanten und Konstruktor Allgemeine Java-Themen 9
E Finale Attribute und Konstruktor Allgemeine Java-Themen 3
S Konstruktor ermitteln Allgemeine Java-Themen 3
B Konstruktor wird nicht aufgerufen Allgemeine Java-Themen 4
T class.newinstance + try/catch-konstruktor Allgemeine Java-Themen 6
S Neue Instanz eines Objekts erzeugen - Konstruktor erhaelt Parameter. Allgemeine Java-Themen 5
B Konstruktor - Vererbungsproblem Allgemeine Java-Themen 2
S konstruktor vererben Allgemeine Java-Themen 5
B Problem mit Methodenaufruf in Konstruktor Allgemeine Java-Themen 6
D [SOLVED] Collection wird nicht richtig per Konstruktor übernommen Allgemeine Java-Themen 8
S Instanz in einer Klasse erstellen, und dem Konstruktor die eigene Klasse mitgeben Allgemeine Java-Themen 4
M Konstruktor / statischer Block Allgemeine Java-Themen 13
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
J Klasse auf Konstruktor oder Methode testen? Allgemeine Java-Themen 3
Junktyz Konstruktor Allgemeine Java-Themen 9
T Schleife im Konstruktor? Allgemeine Java-Themen 9
conan2 super-super-Konstruktor? Allgemeine Java-Themen 3
P static-Methode aus dem Konstruktor aufrufen Allgemeine Java-Themen 6
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
MQue zaehlen im Konstruktor Allgemeine Java-Themen 3
V Initialisierung nur im Konstruktor? Allgemeine Java-Themen 14
T Konstruktor von Hashtable unter Java 5.0! Allgemeine Java-Themen 3
M Feld initialisieren, direkt oder Konstruktor Allgemeine Java-Themen 2
D super-Konstruktor ist nicht super ;) Allgemeine Java-Themen 6
A Objektmethode aus Konstruktor aufrufen? Allgemeine Java-Themen 14
7 Konstruktor Allgemeine Java-Themen 12
M Konstruktor, der Excpetions wirft Allgemeine Java-Themen 2
H Super-Konstruktor Allgemeine Java-Themen 7
A Exception in Konstruktor - trotzdem wird Objekt erzeugt! Allgemeine Java-Themen 3
S Konstruktor vererben Allgemeine Java-Themen 9
thE_29 String Konstruktor - Umwandlungsprobleme Allgemeine Java-Themen 5
J Probleme mit dem Konstruktor Allgemeine Java-Themen 8
D Kein public Konstruktor Allgemeine Java-Themen 4
K Exception im Konstruktor / Objekt == null Allgemeine Java-Themen 7
S konstruktor nur innerhalb der klasse aufrufbar Allgemeine Java-Themen 5
S konstruktor im interface Allgemeine Java-Themen 5
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
T Der Aufruf von CMD-Programm Allgemeine Java-Themen 30
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
berserkerdq2 Wie mache ich den rekursiven Aufruf in IJVM Allgemeine Java-Themen 3
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
R JDK installieren OpenJDK-Aufruf sehr langsam Allgemeine Java-Themen 4
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
P CMD Aufruf mit Admin-Rechte Allgemeine Java-Themen 2
cool_brivk24 Klassen Klassen Aufruf Fehlgeschlagen Allgemeine Java-Themen 14
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
J Genson - zirkulärer Aufruf Allgemeine Java-Themen 1
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
B Kodierung von String -> URL aufruf Allgemeine Java-Themen 2
G Rekursiver Aufruf von Waagengewichten Allgemeine Java-Themen 2
H Klassennamen zum Aufruf eines statischen Feldes aus Variable holen Allgemeine Java-Themen 4
M datei aufruf prüfen Allgemeine Java-Themen 9
D JNI DLL Aufruf Allgemeine Java-Themen 32
M datei aufruf datum auslesen Allgemeine Java-Themen 5
A Java Verhalten bei parallelem Aufruf derselben Methode?? Allgemeine Java-Themen 2
F Parameter im Link /jar-Aufruf Allgemeine Java-Themen 12
Z Socket Aufruf einer Klasse in einer anderen Klasse Allgemeine Java-Themen 6
A JNI: Unerklärlicher Crash beim Aufruf von CallVoidMethod Allgemeine Java-Themen 9
S Variablen bei Aufruf zurücksetzen Allgemeine Java-Themen 4
J yield() Aufruf in einer synchronized-Methode Allgemeine Java-Themen 13
R JAR aus Batchdatei Aufruf Allgemeine Java-Themen 4
Kr0e Sichtbarkeitsregeln nach Executor-Aufruf Allgemeine Java-Themen 5
F rekursiver Aufruf (Sudoku und Guice) Allgemeine Java-Themen 19
B Cipher.getInstance Aufruf sehr langsam Allgemeine Java-Themen 2
M Aufruf von Unix-Shell in Java Allgemeine Java-Themen 5
G Aufruf einer Methode in IStatus exex Allgemeine Java-Themen 4
E Seltsamer aufruf von java.util.Date.toString() Allgemeine Java-Themen 3
C Netbeans - Aufruf-Reihenfolge Allgemeine Java-Themen 5
Nicer Problem mit Link aufruf Allgemeine Java-Themen 6
M Cobol-Aufruf aus Java Allgemeine Java-Themen 6
C Aufruf einer Methode einer anderen Klasse Allgemeine Java-Themen 14
T Lib/Framework zum Automatischen Aufruf von Methoden Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben