Guten Morgen,
Ich beschäftige mich gerade mit generischen Klassen und speziel mit Wildcards.
Bei den lower Bounded Wildcards habe ich Probleme. Ich habe das so verstanden, dass wenn ich etwas mit <? super "BeispielKlasse"> typisiere, nur Objekte zuweisen kann, die in der Hierarchie höher oder gleich der Beispielklasse sind.
Habe um das Nachvollziehen zu können Klassen mit folgender Erbschaftsbeziehung erstellt:
Klamotten -> Hose -> Jeans
Dazu kommt noch eine generische Klasse "Behälter" mit zwei privaten Variablen, die eben zwei Objekte übergeben bekommen soll.
In der main habe ich nun zwei Jeans-Objekte instantiiert.
Wenn ich diese jetzt an ein Behaelter<? super Hosen>-Objekt im Konstruktor übergebe, dann müsste mir doch der Compiler die Jeansobjekte rot markieren oder nicht? Das tut er bei mir nämlich nicht. Ich kann das Programm ohne Probleme laufen lassen, egal welchen Objekttyp ich an den Konstruktor übergebe.
Außerdem habe ich noch eine Frage zu der letzten Zeile im Code. Wenn ich schreibe:
dann meckert der Compiler folgendes: unexpected type. class or interface qithout bounds.
Was ist damit gemeint und warum muss ich die letzten Spitzklammern leer lassen, damit er nicht meckert?
Vielen Dank für eure Hilfe
Ich beschäftige mich gerade mit generischen Klassen und speziel mit Wildcards.
Bei den lower Bounded Wildcards habe ich Probleme. Ich habe das so verstanden, dass wenn ich etwas mit <? super "BeispielKlasse"> typisiere, nur Objekte zuweisen kann, die in der Hierarchie höher oder gleich der Beispielklasse sind.
Habe um das Nachvollziehen zu können Klassen mit folgender Erbschaftsbeziehung erstellt:
Klamotten -> Hose -> Jeans
Dazu kommt noch eine generische Klasse "Behälter" mit zwei privaten Variablen, die eben zwei Objekte übergeben bekommen soll.
In der main habe ich nun zwei Jeans-Objekte instantiiert.
Wenn ich diese jetzt an ein Behaelter<? super Hosen>-Objekt im Konstruktor übergebe, dann müsste mir doch der Compiler die Jeansobjekte rot markieren oder nicht? Das tut er bei mir nämlich nicht. Ich kann das Programm ohne Probleme laufen lassen, egal welchen Objekttyp ich an den Konstruktor übergebe.
Code:
package test;
public class Probe{
public static void main (String[] args) {
Kleidung k0 = new Kleidung();
Kleidung k1 = new Kleidung();
Hose h0 = new Hose();
Hose h1 = new Hose();
Jeans j0 = new Jeans();
Jeans j1 = new Jeans();
//Behälter hat WildCard für alles was hierarchisch gleich und über Hose liegt
//nachfolgender Code funktioniert aber trotzdem...?!
Behaelter<? super Hose> behaelter = new Behaelter<>(j0,j1);
}
}
Außerdem habe ich noch eine Frage zu der letzten Zeile im Code. Wenn ich schreibe:
Code:
Behaelter<? super Hose> behälter = new Behaelter<? super Hose>(j0,j1);
Was ist damit gemeint und warum muss ich die letzten Spitzklammern leer lassen, damit er nicht meckert?
Vielen Dank für eure Hilfe