Type Erasure in Java

michael1989

Mitglied
Hallo, ich lerne Java im Selbststudium mit einem Buch und hätte eine Verständnisfrage zum Thema Type Erasure in Java.
Ich wäre sehr froh, wenn du mir helfen könntest/Sie mir helfen könnten:

So viel ich über Type Erasure in Java weiß, werden nach oben beschränkte Wildcard-Typen durch die "Upper Bound" - die obere Grenze - ersetzt
und aus der "Lower Bound" wird Object.
Wie funktioniert das genau, dass generische Typen so umgewandelt werden, dass die Abwärtskompatibilität gewährleistet ist?
Müssen Casts hinzugefügt werden?
 

Barista

Top Contributor
So viel ich über Type Erasure in Java weiß, werden nach oben beschränkte Wildcard-Typen durch die "Upper Bound" - die obere Grenze - ersetzt
und aus der "Lower Bound" wird Object.
Nein, Bounds haben nichts mit Type-Erasure zu tun.

Wie funktioniert das genau, dass generische Typen so umgewandelt werden, dass die Abwärtskompatibilität gewährleistet ist?
Zur Laufzeit werden die generischen Typen nicht geprüft.

Abwärtskompatibilität?

Vielleicht zu Java4?

Java4 kann nicht mit Java5-class-Files (Bytecode) umgehen.
 

Barista

Top Contributor
[CODE lang="java" title="Type-Erasure"]// der Typ-Parameter ist im class-File enthalten, kein Type-Erasure
class A<T> {

}

class B
// das Typ-Argument ist im class-File enthalten, kein Type-Erasure
extends A<String> {

}

class C {
// das Typ-Argument ist im class-File enthalten, kein Type-Erasure
List<String> fieldStringList;

void myMethod(
// das Typ-Argument ist im class-File enthalten, kein Type-Erasure
List<String> paramStringList) {
// das Typ-Argument ist nicht im class-File enthalten, Type-Erasure
List<String> localStringList = new ArrayList<>();
}

}[/CODE]

An meinem Code-Beispiel siehst Du, dass Type-Erasure nur in executable-Blöcken (Methoden, Konstruktoren, Initializer) stattfindet.
 

mihe7

Top Contributor
So viel ich über Type Erasure in Java weiß, werden nach oben beschränkte Wildcard-Typen durch die "Upper Bound" - die obere Grenze - ersetzt
Jein, das Erasure von List<? extends Number> ist schlicht List. Der Compiler stellt sicher, dass es sich um eine Liste eines festen aber unbekannten Typs handelt, der von Number abgeleitet ist. Dadurch, dass der Typ nicht näher bekannt ist, kannst Du z. B. keine Werte hinzufügen. Du kannst aber z. B. über die Liste iterieren und die Methoden von Number verwenden.

Wie funktioniert das genau, dass generische Typen so umgewandelt werden, dass die Abwärtskompatibilität gewährleistet ist?
Müssen Casts hinzugefügt werden?
Wie meinen?
 

temi

Top Contributor
Die Doku von Oracle sagt dazu:

Type Erasure​

Generics were introduced to the Java language to provide tighter type checks at compile time and to support generic programming. To implement generics, the Java compiler applies type erasure to:
  • Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods.
  • Insert type casts if necessary to preserve type safety.
  • Generate bridge methods to preserve polymorphism in extended generic types.
Type erasure ensures that no new classes are created for parameterized types; consequently, generics incur no runtime overhead.
 

michael1989

Mitglied
Jein, das Erasure von List<? extends Number> ist schlicht List. Der Compiler stellt sicher, dass es sich um eine Liste eines festen aber unbekannten Typs handelt, der von Number abgeleitet ist. Dadurch, dass der Typ nicht näher bekannt ist, kannst Du z. B. keine Werte hinzufügen. Du kannst aber z. B. über die Liste iterieren und die Methoden von Number verwenden.


Wie meinen?
Wie stellt der Compiler sich, dass der Typ Number ist oder von Number ableitet?
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Wie stellt der Compiler sich, dass der Typ Number ist oder von Number ableitet?
Der Compiler kennt ja Deinen Code. Wenn Du also versuchst, eine List<String> an eine List<? extends Number> zuzuweisen, weiß der Compiler anhand der Objekthierarchie, dass String nicht kompatibel zu Number ist. Wenn Du dagegen eine List<Double> rüberschiebst, ist das ok, da Double von Number abgeleitet ist.

Java:
List<? extends Number> list;
list = new ArrayList<String>(); // Compilerfehler: String ist nicht von Number abgeleitet
list = new ArrayList<Double>(); // ok, da Double ein von Number abgeleiteter Typ ist
 

michael1989

Mitglied
Der Compiler kennt ja Deinen Code. Wenn Du also versuchst, eine List<String> an eine List<? extends Number> zuzuweisen, weiß der Compiler anhand der Objekthierarchie, dass String nicht kompatibel zu Number ist. Wenn Du dagegen eine List<Double> rüberschiebst, ist das ok, da Double von Number abgeleitet ist.

Java:
List<? extends Number> list;
list = new ArrayList<String>(); // Compilerfehler: String ist nicht von Number abgeleitet
list = new ArrayList<Double>(); // ok, da Double ein von Number abgeleiteter Typ ist
Vielen Dank für deine Antwort!
Auf
steht geschrieben, dass der generische Typ ersetzt wird
 

httpdigest

Top Contributor
An meinem Code-Beispiel siehst Du, dass Type-Erasure nur in executable-Blöcken (Methoden, Konstruktoren, Initializer) stattfindet.
Das ist korrekt. Alle Deklarationen, die potenziell Schnittstellen zu anderen Libraries/Anwendungen sein könnten (Konstruktorsignatur, Methodensignatur, sowie Instanz- und Klassenfelder) behalten ihre generischen Typinformationen. Das hat den Hintergrund, dass beim Einbinden von bereits nur noch als .class Dateien vorhandenen externen Libraries (wie z.B. die JRE Class Library) der Compiler in deinem Sourcecode, der die externe Library verwendet, auch noch Typfehler bezüglich generischer Typen identifizieren kann.
Wenn du also eine Library mit einer Klasse und einer Methode baust, die nur eine List<Integer> als Parameter bekommen darf, diese Klasse dann kompilierst und jemand anderem gibst, der sie bei sich im Classpath einbindet, dann wird dort auch noch sichergestellt, dass deine Methode auch ein List<Integer> bekommt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
J Scanner cannot be resolved to a type Java Basics - Anfänger-Themen 3
Denix The public type Main must be defined in its own fileJava(16777541) Java Basics - Anfänger-Themen 13
M Umgang mit dem Type "Date" Java Basics - Anfänger-Themen 6
N Fehler "Cannot instantiate the type" Java Basics - Anfänger-Themen 3
nbergmann The type JOptionPane is not accessible. Java Basics - Anfänger-Themen 4
Vivien Hilfe bei Type Conversion Java Basics - Anfänger-Themen 3
Flo :3 Variablen Type dismatch: cannot convert from string to int Java Basics - Anfänger-Themen 9
P Jackson mapper.readValue mit generischem Type Java Basics - Anfänger-Themen 10
H Methode mit Array als Rückgabe This method must return a result of Type int[] Java Basics - Anfänger-Themen 2
D Klassen undefined for the type 'object' Java Basics - Anfänger-Themen 2
N The method setSaldo(double) in the type Konto is not applicable for the arguments (int, int) Java Basics - Anfänger-Themen 2
F Type safety: A generic array of.. Fehler Java Basics - Anfänger-Themen 3
W The type Long is not visible HashMap Java Basics - Anfänger-Themen 4
J-Gallus Ein Getter bekommt eine anderen Type als er Return soll Java Basics - Anfänger-Themen 9
S Fehler: Editor does not contain a main type Java Basics - Anfänger-Themen 3
G Programm wird nicht ausgeführt: Editor does not contain a main type Java Basics - Anfänger-Themen 10
Syncopated Pandemonium Compiler-Fehler The constructor MP3File(File) refers to the missing type NoMPEGFramesException Java Basics - Anfänger-Themen 7
K Operatoren The Operator * is undefined for the argument type(s) double, String Java Basics - Anfänger-Themen 4
K VerketteteListen unexpected type Fehler Java Basics - Anfänger-Themen 2
B OOP Cannot instantiate the type AuDList<Integer> Java Basics - Anfänger-Themen 18
T Compiler-Fehler Null type safety (type annotations) Java Basics - Anfänger-Themen 5
B Methoden The method mirror(double[]) in the type Convolution is not applicable for the arguments (double) Java Basics - Anfänger-Themen 8
I Fehlermeldung: Java does not contain a main type Java Basics - Anfänger-Themen 1
J Fehlermeldung : cannot invoke char(at) int on the primitive type int --- Anfänger Java Basics - Anfänger-Themen 5
V RMI - argument type mismatch Java Basics - Anfänger-Themen 1
S Selection does not contain a main type! Java Basics - Anfänger-Themen 5
R The method printf(String, Object[]) in the type printStrem in not applicable for the arguments ... Java Basics - Anfänger-Themen 3
M "illegal start of type" eindimensionales Schiffe versenken Java Basics - Anfänger-Themen 7
S Vererbung Fehlermeldung: the hierarchy of the type "class name" is inconsistent Java Basics - Anfänger-Themen 10
S Selection does not contain a main type Java Basics - Anfänger-Themen 12
H enum Type Java Basics - Anfänger-Themen 6
K Variablen RETURN in Case-Switch / This method must return a result of type Item Java Basics - Anfänger-Themen 4
P Variablen generic type variablen in object array Java Basics - Anfänger-Themen 1
P enum: cannot be resolved to a type Java Basics - Anfänger-Themen 2
I Erste Schritte Eclipse - Does not contain a main type Java Basics - Anfänger-Themen 8
W Enum Konstruktor Type Java Basics - Anfänger-Themen 2
C MIME-Type null Java Basics - Anfänger-Themen 4
L The operator && is undefined for the argument type(s) String, boolean Java Basics - Anfänger-Themen 8
G default class type Java Basics - Anfänger-Themen 3
J Type inference Java Basics - Anfänger-Themen 26
C Warning: Type safety: Potential heap pollution via varargs parameter array Java Basics - Anfänger-Themen 5
Joew0815 Compiler-Fehler Unexpected Type - Problem mit Variablen rechnen Java Basics - Anfänger-Themen 7
T selection method does not contain a main type Java Basics - Anfänger-Themen 7
O unexpected type - weiß nicht weiter! Java Basics - Anfänger-Themen 3
M Datentypen problem!! Unexpected type in bleuj Java Basics - Anfänger-Themen 2
P Compiler-Fehler unexpected type - Stehe auf dem Schlauch Java Basics - Anfänger-Themen 3
M This method must return a result of type int Java Basics - Anfänger-Themen 13
T Unhandled exception type Java Basics - Anfänger-Themen 2
J unexpected type variable/value Java Basics - Anfänger-Themen 2
M Collections mit >2 type Parametern? Java Basics - Anfänger-Themen 8
D Compiler-Fehler void is an invalid type for the variable Java Basics - Anfänger-Themen 5
H LocationReferenceImpl cannot be resolved to a type Java Basics - Anfänger-Themen 5
K unexpected type variable/value Java Basics - Anfänger-Themen 7
M Fehlermeldung: the method.... ist undefined for the type object Java Basics - Anfänger-Themen 6
K Erste Schritte selection does not contain a main type Java Basics - Anfänger-Themen 3
M Objekt Cannot instantiate the type ... Java Basics - Anfänger-Themen 10
S this method must return a result of type double Java Basics - Anfänger-Themen 2
L Type/Cast Problem Java Basics - Anfänger-Themen 6
A Variablen Type safety Warnung beseitigen Java Basics - Anfänger-Themen 3
X enum Fehlermeldung "The public type Day must be defined in its own file" Java Basics - Anfänger-Themen 8
B Editor does not contain a main type Java Basics - Anfänger-Themen 3
E Datentypen type cast problem (int, byte,) Java Basics - Anfänger-Themen 5
L Illegal Start of Type, wie finde ich den fehler Java Basics - Anfänger-Themen 4
V Eclipse "Selection does not contain a main type" Java Basics - Anfänger-Themen 13
P BlueJ Fehlermeldung - Illegal Start of Type Java Basics - Anfänger-Themen 8
J Color cannot be resolved to a type Java Basics - Anfänger-Themen 4
B Undefined for the type... Java Basics - Anfänger-Themen 15
D Unhandled Exception type IOException in Constructor Java Basics - Anfänger-Themen 1
B Selection does not contain a main type Java Basics - Anfänger-Themen 2
A The method getYear() from the type Date is deprecated Java Basics - Anfänger-Themen 6
B Type von Class erhalten Java Basics - Anfänger-Themen 2
G incompatibel return type bei vererbung Java Basics - Anfänger-Themen 18
J String cannot be resolved to a type Java Basics - Anfänger-Themen 6
C Editor does not contain a main type Java Basics - Anfänger-Themen 7
J Type-Casting Java Basics - Anfänger-Themen 8
M 'void' type not allowed Java Basics - Anfänger-Themen 18
lumo lösen von: "Type safety"? Java Basics - Anfänger-Themen 4
B method intValue() is undefined for the type String (?) Java Basics - Anfänger-Themen 4
H wieso fehler ? must return a type of int. Java Basics - Anfänger-Themen 4
G Konvertierung String in long type Java Basics - Anfänger-Themen 15
G raw type Java Basics - Anfänger-Themen 2
N Java Sound - Unsupported control type Java Basics - Anfänger-Themen 2
J System.in.read(): Unhandled exception type IOException Java Basics - Anfänger-Themen 12
S falscher return type ? Java Basics - Anfänger-Themen 4
F The type . is ambiguous Java Basics - Anfänger-Themen 2
A Generics Raw Type Java Basics - Anfänger-Themen 9
S type safety, conversions Java Basics - Anfänger-Themen 6
G Kein main Type? Java Basics - Anfänger-Themen 3
S Type safety bei einer ArrayList Java Basics - Anfänger-Themen 2
N invalid method declaration; return type required Java Basics - Anfänger-Themen 4
S Type safety Java Basics - Anfänger-Themen 6
S StringToInt() - Type mismatch: cannot convert from... Java Basics - Anfänger-Themen 16
R Eclipse: This method must return a result of type double. Java Basics - Anfänger-Themen 2
M Fehlermeldung (the method add(OE) in the type Abteilung.) Java Basics - Anfänger-Themen 2
O must be an array type (String array füllen) Java Basics - Anfänger-Themen 7
M method xxx() from the type xxx is deprecated Java Basics - Anfänger-Themen 3
G typeof is undefined for the type "Klassenname" Java Basics - Anfänger-Themen 8
A The method getClass() from the type saveLog is not static Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben