Generics casten

Javt

Aktives Mitglied
Hi,

Ich bin jetzt wirklich verwirrt. Folgendes ist nicht gestattet:
Java:
MyList<Object> l1 = new MyList<String>();

aber folgendes schon:
Java:
MyList l2 = new MyList<String>();
--> letztendlich sind die Elemente von "l2" dann vom Typ "Object". Das kann doch nicht sein. Wieso ist das eine erlaubt, das andere nicht? Ich mein im Grunde sind beide dasselbe? Bzw. wieso ist denn dann das zweite "l2" nicht vom Typ "String"?

lg
 
Zuletzt bearbeitet:

HoaX

Top Contributor
Das erste ist nicht erlaubt, da du ja sonst z.B. einen Integer in die Liste einfügen könntest, obwohl die Liste aber eigentlich nur String zulässt.

Beim Zweiten solltest du eine entsprechende Warnung bekommen beim Kompilieren dass es unsicher ist.
 

Javt

Aktives Mitglied
Ja aber das was mir nicht einleuchtet ist: Sowohl l1 als auch l2 sind eigentlich vom selben Typ "Object". Die zweite Liste l2 ist ja auch vom Typ "Object" letztendlich. Das was du sagst sollte für den zweiten Fall doch auch gelten, dass ich eine Liste vom Typ String anlege und versuchen könnte über l2 nicht-Strings in die Liste einzufügen?
 
G

Gast2

Gast
Bei der zweiten Variante verwendest du den Rawtype, das sollte man bei Java >= 1.5, wie auch schon im anderen Thread erwähnt, nicht mehr tun. Eben weils zu Problemen kommen kann wenn du plötzlich andere Objekte in die Liste steckst.

EDIT:
Da haben sich unsere Antworten grad überschnitten.

Sowohl l1 als auch l2 sind eigentlich vom selben Typ "Object".
l1 ist vom Typ List<Object>, l2 ist vom Typ List, das ist nen kleiner aber feiner Unterschied.

Das was du sagst sollte für den zweiten Fall doch auch gelten, dass ich eine Liste vom Typ String anlege und versuchen könnte über l2 nicht-Strings in die Liste einzufügen?
Nein, wenn du den Rawtype verwendest kann Java nicht wissen was für eine Liste du da tatsächlich hast, daher darfst du alles einfügen. Hast du stattdessen eine List<Object> weiß Java dass nur Instanzen vom Typ Object reindürfen.
 
Zuletzt bearbeitet von einem Moderator:

Javt

Aktives Mitglied
Also manches in Java ist schon sehr merkwürdig. Nurweil es "RawType" ist, ist das was bei Generics verboten ist zugelassen und man darf schlampen.
 
G

Gast2

Gast
Und wieder überschnitten...
Vor Java 1.5 gabs noch gar keine Generics, daher kommt der (Raw)Type List. Da musste man noch selbst dafür sorgen dass das was man in die Liste packt auch darein darf. Seit den Generics hilft einem da der Compiler. Den Rawtype musste man drin lassen, damit alte Programme kompatibel bleiben.
 
S

Spacerat

Gast
Beim ersteren hätte die List<String> etwas gegen das Einfügen von Objects, deswegen funktioniert es nicht (@edit: schlampereien mit RawType würde ich mir deswegen auch schenken, dann hagelts irgendwann Exceptions). Beim zweiten fehlt schlicht die Typisierung, das gibt 'ne Warnung. Um es ohne Warnung hinzubekommen, sollte es
Java:
MyList<?> l1 = new MyList<String>();
tun, aber einer solchen Liste liessen sich nur null-Objekte hinzufügen.
 
Zuletzt bearbeitet von einem Moderator:

xehpuk

Top Contributor
schlampereien mit RawType würde ich mir deswegen auch schenken, dann hagelts irgendwann Exceptions
Afaik löscht der Compiler sämtliche Generics-Informationen, wenn ein Rawtype verwendet wird. Von daher dürfte nie eine Exception fliegen.

Läuft problemlos durch:
Java:
public class GenericsVsRaw {
	public static void main(final String[] args) {
		addAndPrint(new ArrayList<Void>());
		addAndPrint(new ArrayList<Integer>());
		addAndPrint(new ArrayList<String>());
		addAndPrint(new ArrayList<Object>());
	}
	
	static void addAndPrint(final List list) {
		add(list);
		print(list);
	}

	static void add(final List list) {
		list.add(new Object());
		list.add('C');
		list.add(1.337);
		list.add(null);
		list.add("S");
		list.add(42);
	}

	static void print(final List list) {
		for (final Object o : list) {
			System.out.println(o);
		}
	}
}
 
G

Gast2

Gast
Du stellst in dem Beispiel ja auch nichts sinnvolles mit der Liste an. Wenn du irgendwann mal versuchst aus der Liste was konkretes rauszuholen fliegt dir ne ClassCastException wenns nicht vom erwarteten Typ ist.
 
S

Spacerat

Gast
@Xepuk: Oh doch, da fliegt eine... z.B. wenn man nach "add(0, object)" ein "String string = (String) get(0)" versucht. Das ist prähistorisch... wozu gibt es eigentlich diese Generics? XD Im übrigen verwirft der Compiler sämtliche Generics. Decompilier mal eine Java1.5+ Klasse.

@EikeB: War isch langsam, nisch wahr? ;)
 
Zuletzt bearbeitet von einem Moderator:

xehpuk

Top Contributor
Ich meinte damit, dass keine versteckte Exception fliegt. Dass beim expliziten Cast eine fliegen kann, ist klar.

Im übrigen verwirft der Compiler sämtliche Generics.
Kommt drauf an, was du darunter verstehst. Wenn im Bytecode ein (sicherer) Cast eingefügt wird, ist das für mich schon kein "Verwerfen".

Andererseits können sie auch "richtig" hinterlegt werden. Gib
Code:
javac
mal den Parameter
Code:
-g
mit. Dann werden die
Code:
Code
-Attribute auch jeweils ein
Code:
LocalVariableTypeTable
-Attribut haben. Dort finden sich die Typparameter in der angegebenen Signatur wieder.
Hat dann zwar keine Auswirkung auf die Ausführung des Codes durch die JVM, ist aber für Debugger oder Decompiler nützlich.

[EDIT]Und dass der Decompiler, den du genutzt hast, dieses Attribut nicht berücksichtigt, ist dessen Manko. Würde mich bei solchen Aussagen also nicht auf Decompiler verlassen. JD-GUI kriegts auch nicht gebacken. Wird Zeit, dass ich mich auch mal an einen ransetze. :)[/EDIT]
 
Zuletzt bearbeitet:
H

hüteüberhüte

Gast
Code:
<Object>
ist !=
Code:
<String>
. Bei Generics ist es nicht erlaubt, einen Supertyp anzugeben
 
S

Spacerat

Gast
[EDIT]Und dass der Compiler, den du genutzt hast, dieses Attribut nicht berücksichtigt, ist dessen Manko. Würde mich bei solchen Aussagen also nicht auf Decompiler verlassen. JD-GUI kriegts auch nichts gebacken. Wird Zeit, dass ich mich auch mal an einen ransetze. :)[/EDIT]
Dieses Attribut kann man nur berücksichtigen, wenn es im Bytecode steht und das ist nur bei Entwicklungsklassen (z.B. denen des JDK) der Fall. Distributionen (z.B. Klassen der JRE) haben diese Infos jedoch nicht. Fakt bleibt aber, dass die JVM nach wie vor komplett ohne Generics auskommt, da muss auch nichts gecastet werden, weil der Bytecode von javac bereits überprüft wurde. Generics nicht dekompilieren zu können wäre demnach also kein Manko.
Wie, du willst einen eigenen Decompiler entwickeln? Schau dir mal Jasper an. Neben JD-Gui gibt's auch noch IDA-Pro, aber der disassembled glaub' ich auch nur.
 
Zuletzt bearbeitet von einem Moderator:

xehpuk

Top Contributor
Dieses Attribut kann man nur berücksichtigen, wenn es im Bytecode steht
Ja, wird es bei JD-GUI aber nicht.

Distributionen (z.B. Klassen der JRE) haben diese Infos jedoch nicht.
Diese haben zumindest das
Code:
Signature
-Attribut an Klassen, Methoden und Feldern kleben. Dieses Attribut wird selbst dann generiert, wenn man
Code:
javac
ein
Code:
-g:none
mitgibt.

Fakt bleibt aber, dass die JVM nach wie vor komplett ohne Generics auskommt, da muss auch nichts gecastet werden, weil der Bytecode von javac bereits überprüft wurde.
Wie meinst du das genau? Aus Generics werden letztendlich Casts (
Code:
checkcast
-Instructions) im Bytecode.

Source:
Java:
public static String generic() {
	return new java.util.ArrayList<String>().get(0);
}
Kompiliert mit
Code:
javac -g:none
und disassembliert mit
Code:
javap -c
:
Code:
public static java.lang.String generic();
  Code:
     0: new           #2                  // class java/util/ArrayList
     3: dup
     4: invokespecial #3                  // Method java/util/ArrayList."<init>":()V
     7: iconst_0
     8: invokevirtual #4                  // Method java/util/ArrayList.get:(I)Ljava/lang/Object;
    11: checkcast     #5                  // class java/lang/String
    14: areturn

Wie, du willst einen eigenen Decompiler entwickeln? Schau dir mal Jasper an. Neben JD-Gui gibt's auch noch IDA-Pro, aber der disassembled glaub' ich auch nur.
Sieht so aus, als würden beide nur disassemblieren. Bin es irgendwie leid, dass es keinen aktuellen und bugfreien Decompiler gibt (oder ich war bei der Suche bisher nicht erfolgreich). Mit einem eigenen Disassembler bin ich auch fast fertig (jaja, da gibts auch schon so Projekte wie BCEL und ASM, will mich aber nicht auf deren Weiterentwicklung verlassen und nebenbei auch einen Lerneffekt mitnehmen).
 
S

Spacerat

Gast
Der Code hat gar nichts mehr von Generics, so mein ich das. Wär' ja auch was, wenn's anders wär. Pre 1.5er Javacode liesse sich ja sonst kaum mehr ausführen.
Java:
public static String notGeneric() {
	return (String) new java.util.ArrayList().get(0);
}
Code:
public static java.lang.String notGeneric();
     0  new java.util.ArrayList [16]
     3  dup
     4  invokespecial java.util.ArrayList() [18]
     7  iconst_0
     8  invokevirtual java.util.ArrayList.get(int) : java.lang.Object [19]
    11  checkcast java.lang.String [23]
    14  areturn
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M casten und Generics Java Basics - Anfänger-Themen 9
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben