Hey, ich habe grade ein bisschen Probleme bei der Typersetzung des Compilers bezüglich Java Generics.
Ich habe beispielsweise folgende Klassen:
und
Jetzt kann ich (trivialerweise) folgenden Aufruf machen:
(Ich weiß, das Originalarray wird schon geändert, ich returne nur nochmal das Array und speicher es erneut in einer anderen Variable um mein Problem mit den Rückgabewerten zu veranschaulichen).
Folgender Aufruf schlägt (auch trivialerweise) fehl:
Das kann ja nicht gehen, weil Bar nicht Comparable<Bar> implementiert und deswegen der generische Typ "E" nicht auf Bar gesetzt werden kann weil sonst die Methodensignatur nicht mehr passt.
Jetzt ist es aber so, dass folgende Zeile klappt:
Mit dem barArray genau wie im vorigen Beispiel erzeugt.
Wie kann man sich das vorstellen. Der Compiler versucht erst, den generischen Typen auf "Bar" zu setzen und merkt, dass das nicht funktioniert. Dann probiert ers mit der Oberklasse "Foo" und merkt das passt oder wie läuft das?
Ich hatte die Frage schonmal woanders gestellt, da ging die letzte Zeile nicht durch und es kam ein "Bound mismatch". Ist das irgendein "Feature" aus einer neuen Java-Version oder so?
Hoffe mir kann jemand erklären, was da genau passiert, wie dieser generische Typ ersetzt wird.
Ich hab ja meine Vermutung geäußert bin allerdings verwirrt, dass es bei jemand anderem nicht kompiliert hat.
Grüße
Ich habe beispielsweise folgende Klassen:
Java:
public class Foo implements Comparable<Foo>{
int wert;
public Foo(int x) {
wert=x;
}
@Override
public int compareTo(Foo o) {
return wert-o.wert;
}
public static <E extends Comparable<? super E>> E[] bubbleSort(E[] array) {
for(int iter =1; iter< array.length; iter++){
for(int inner = 0; inner < (array.length - iter); inner ++){
if((((array[inner])).compareTo(array[inner+1])) > 0){
E tmp = array[inner];
array[inner] = array[inner + 1];
array[inner + 1] = tmp;
}
}
}
return array;
}
}
Java:
public class Bar extends Foo {
public Bar(int x) {
super(x);
}
}
Jetzt kann ich (trivialerweise) folgenden Aufruf machen:
Java:
Foo[] fooArray = new Foo[10];
for(int i=0; i<10; i++){
fooArray[i]=new Foo(random.nextInt(50));
}
Foo[] fooArray2 = Foo.bubbleSort(fooArray);
(Ich weiß, das Originalarray wird schon geändert, ich returne nur nochmal das Array und speicher es erneut in einer anderen Variable um mein Problem mit den Rückgabewerten zu veranschaulichen).
Folgender Aufruf schlägt (auch trivialerweise) fehl:
Java:
Bar[] barArray = new Bar[10];
for(int i=0; i<10; i++){
barArray[i]=new Bar(random.nextInt(50));
}
Bar[] barArray2 = Foo.bubbleSort(barArray);
Jetzt ist es aber so, dass folgende Zeile klappt:
Java:
Foo[] fooArray2 = Foo.bubbleSort(barArray);
Wie kann man sich das vorstellen. Der Compiler versucht erst, den generischen Typen auf "Bar" zu setzen und merkt, dass das nicht funktioniert. Dann probiert ers mit der Oberklasse "Foo" und merkt das passt oder wie läuft das?
Ich hatte die Frage schonmal woanders gestellt, da ging die letzte Zeile nicht durch und es kam ein "Bound mismatch". Ist das irgendein "Feature" aus einer neuen Java-Version oder so?
Hoffe mir kann jemand erklären, was da genau passiert, wie dieser generische Typ ersetzt wird.
Ich hab ja meine Vermutung geäußert bin allerdings verwirrt, dass es bei jemand anderem nicht kompiliert hat.
Grüße
Zuletzt bearbeitet: