Verständnisproblem bei Anwendung von Lower Bounded Wildcards

2b|!2b

Mitglied
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.
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);
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 :)
 

2b|!2b

Mitglied
Okay habs selbst rausbekommen :rolleyes:

Wenn man die zweite Frage beantwortet, dann erklärt sich auch die Erste.

Die linken Spitzklammern beschreiben die eigentliche Lower Bounded Wildcard und in die rechten Spitzklammern können alle Typen hineingeschrieben werden, die in der Hierarchieebene über der unteren Grenze liegen (in diesem Fall Hose).

Erst dann funktioniert sozusagen auch die Wildcard-Funktion und er meckert wenn ich die Jeans-Objekte übergeben will.
 

2b|!2b

Mitglied
ich würde mich über einen Erklärungsversuch schon freuen :D wenn ich nämlich folgendes mache:
Code:
        Behaelter<? super Hose> behälter = new Behaelter<>("1 ","e");
Meckert der Compiler nämlich nicht obwohl ich doch der Referenz "Behaelter<? super Hose>" verbiete ihm etwas anderes zu übergeben Objekte, die in der Klassenhierarchie über ihm stehen. Und Die Strings dürften ja nicht übergeben werden, oder nicht?
 

Flown

Administrator
Mitarbeiter
Also eigentlich geht es darum, was die Variable behälter sein kann.
Möglich ist genau das:
Java:
Behaelter<? super Hose> behälter = new Behaelter<Hose>();
Behaelter<? super Hose> behälter = new Behaelter<Kleidung>();
Behaelter<? super Hose> behälter = new Behaelter<Object>();
Man kann alles in den Behälter werfen, dass eine Hose oder in der Hierarchie darüber steht.
Es ist nun garantiert, dass man aus dem Behälter nur Object lesen kann, aus eben oben stehenden Gründe.

Beispiel:
Java:
public class Test {
  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();
 
    Behaelter<? super Hose> behaelter = new Behaelter<>(j0, j1, k0);
    for (Object object : behaelter) {
      System.out.println(object);
    }
  }
}
class Kleidung {
 
  @Override
  public String toString() {
    return "Kleidung []";
  }
}

class Hose extends Kleidung {
 
  @Override
  public String toString() {
    return "Hose []";
  }
 
}

class Jeans extends Hose {
 
  @Override
  public String toString() {
    return "Jeans []";
  }
 
}

class Behaelter<T> implements Iterable<T> {
  private Collection<T> coll;
 
  @SafeVarargs
  public Behaelter(T... ts) {
    coll = Arrays.asList(ts);
  }
 
  @Override
  public String toString() {
    return "Behaelter [coll=" + coll + "]";
  }
 
  @Override
  public Iterator<T> iterator() {
    return coll.iterator();
  }
 
}
Wenn du Strings übergibst, macht der Diamond genau das aus deinem Typ:
Java:
Behaelter<? super Hose> behaelter = new Behaelter<Object>("a", "b");
Und hier ist es absolut valide einen String zu übergeben, da er ein Object ist.
 
Zuletzt bearbeitet:

2b|!2b

Mitglied
Ah! behaelter wird also meckern, wenn ich in den rechten Diamond folgendes Schreibe:
Code:
    Behaelter<? super Hose> behaelter = new Behaelter<Hose>(j0, j1, k1);
Das liegt daran, dass der durch behaelter referenzierte Collector dann nur noch Referenzen vom Typ Hose und Jeans aufnehmen kann. Die Referenz k1 vom typ Kleidung ist nicht mehr zulässig.

Wenn ich aber den rechten Diamond leer lasse kann ich hingegen alles da reintun, wass von Object erbt.

Vielen Dank für die Mühe!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Kleines GIT-Verständnisproblem zwischen zwei Rechnern Java Basics - Anfänger-Themen 6
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
nonickatall Grundsätzliches Verständnisproblem des Aufbaus eines Programms Java Basics - Anfänger-Themen 19
X Verständnisproblem Call-By-Reference Java Basics - Anfänger-Themen 5
P JavaFX: Verständnisproblem bei ComboBox/ChoiceBox etc. Java Basics - Anfänger-Themen 9
T Verständnisproblem mit Assoziationen Java Basics - Anfänger-Themen 7
M Verständnisproblem der Rekursion bei Arrays Java Basics - Anfänger-Themen 8
A Erste Schritte Verständnisproblem Java Basics - Anfänger-Themen 5
S Verständnisproblem Aufgabe Java Basics - Anfänger-Themen 9
S Model View Controller: Verständnisproblem Java Basics - Anfänger-Themen 13
temi Verständnisproblem Class.forName() Java Basics - Anfänger-Themen 3
V Verständnisproblem Java Basics - Anfänger-Themen 22
L [Verständnisproblem] Array wird trotz void rückgabe verändert. Java Basics - Anfänger-Themen 5
A Verständnisproblem Ausgabe Do-While-Schleife Java Basics - Anfänger-Themen 3
J Verständnisproblem einer Methode Java Basics - Anfänger-Themen 20
M Konstruktur - Verständnisproblem Java Basics - Anfänger-Themen 4
C Postinkrement und println - Verständnisproblem Java Basics - Anfänger-Themen 8
T Verständnisproblem beim Vigenere-Verfahren Java Basics - Anfänger-Themen 2
Q MVC Verständnisproblem: Controller vs model.modelChanged() Java Basics - Anfänger-Themen 0
N Verständnisproblem InsertionSort. Java Basics - Anfänger-Themen 2
D Verständnisproblem Java Basics - Anfänger-Themen 2
B VerständnisProblem mit Beispielaufgabe aus Buch Java Basics - Anfänger-Themen 1
H Polymorphie Verständnisproblem Vererbung/Polymorphie Java Basics - Anfänger-Themen 4
FrankR2 Grundsätzliches Verständnisproblem: Java 32/64-bit; Windows 7/8, 32/64-bit-System Java Basics - Anfänger-Themen 5
S Verständnisproblem bei Interfaces Java Basics - Anfänger-Themen 6
V Verständnisproblem Java Basics - Anfänger-Themen 5
V Arrays-verständnisproblem Java Basics - Anfänger-Themen 4
M Collections HashSet verständnisproblem Java Basics - Anfänger-Themen 9
S Verständnisproblem einer Übungsaufgabe Java Basics - Anfänger-Themen 6
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Verständnisproblem mit swing Java Basics - Anfänger-Themen 6
F Methoden Cannot refer to a non-final variable.. verständnisproblem. Java Basics - Anfänger-Themen 7
P Verständnisproblem main Methode Java Basics - Anfänger-Themen 9
S Klassen Verständnisproblem Konstruktor Java Basics - Anfänger-Themen 7
I e.getMessage(); - Verständnisproblem Java Basics - Anfänger-Themen 6
lesni Vererbung Vererbung - Verständnisproblem Java Basics - Anfänger-Themen 2
M OOP Polymorphie/Vererbung Verständnisproblem Java Basics - Anfänger-Themen 2
J Verständnisproblem Methoden-Kettung Java Basics - Anfänger-Themen 3
A Vererbung Verständnisproblem bei Übung Java Basics - Anfänger-Themen 5
E Verständnisproblem Typkonvertierung Java Basics - Anfänger-Themen 4
S OOP Verständnisproblem Umsteiger Java Basics - Anfänger-Themen 22
C Array Verständnisproblem Java Basics - Anfänger-Themen 3
P White-Box-Test Verständnisproblem Java Basics - Anfänger-Themen 11
D : ? Operator -Verständnisproblem Java Basics - Anfänger-Themen 24
G Verständnisproblem: Exceptions Java Basics - Anfänger-Themen 17
L Eclipse verlangt "{" nach ";"... Verständnisproblem Java Basics - Anfänger-Themen 5
D charAt(i) verständnisproblem Java Basics - Anfänger-Themen 4
D Verständnisproblem Marken und Schleifen Java Basics - Anfänger-Themen 19
M Verständnisproblem bei Ternären Operanten bzw. Bedingungsoperator Java Basics - Anfänger-Themen 8
T Datentypen Verständnisproblem mit main Methode Java Basics - Anfänger-Themen 3
M Verständnisproblem Threads Java Basics - Anfänger-Themen 7
X Threads und synchronized - Verständnisproblem Java Basics - Anfänger-Themen 3
W ArrayLists: Verständnisproblem bei remove() Java Basics - Anfänger-Themen 2
B Verständnisproblem zu Swing und Methoden Java Basics - Anfänger-Themen 8
A Postinkrement-Verständnisproblem Java Basics - Anfänger-Themen 12
R Iterator Liste, Verständnisproblem Java Basics - Anfänger-Themen 4
1 Verständnisproblem mit Foreach Java Basics - Anfänger-Themen 4
B Verständnisproblem bei Vererbung Java Basics - Anfänger-Themen 3
W generisches Programmieren - Verständnisproblem Java Basics - Anfänger-Themen 4
A Verständnisproblem Nr 2 Java Basics - Anfänger-Themen 14
A Verständnisproblem Java Basics - Anfänger-Themen 6
A Array Verständnisproblem Java Basics - Anfänger-Themen 8
G Verständnisproblem --> JTree Java Basics - Anfänger-Themen 6
M Verständnisproblem mit der Klasse Thread Java Basics - Anfänger-Themen 10
N BufferedReader Verständnisproblem Java Basics - Anfänger-Themen 12
G Verständnisproblem: Code kompelieren und interpretieren Java Basics - Anfänger-Themen 3
S Polymorphie Verständnisproblem Java Basics - Anfänger-Themen 4
G Verständnisproblem Türme von Hanoi Java Basics - Anfänger-Themen 4
G Verständnisproblem Serverinput einlesen. Java Basics - Anfänger-Themen 4
J Array und Schleifen Verständnisproblem Java Basics - Anfänger-Themen 25
G Verständnisproblem Java Basics - Anfänger-Themen 4
N Verständnisproblem: Mehrere Objekte einer Klasse erstellen Java Basics - Anfänger-Themen 2
S SelectionListener + repaint().Verständnisproblem ;) Java Basics - Anfänger-Themen 7
V Verständnisproblem mit Abstrakten zu Konkreten Klassen Java Basics - Anfänger-Themen 7
A Problem mit der Stringgrösse, bzw Verständnisproblem? Java Basics - Anfänger-Themen 14
A Verständnisproblem mit ScrollPanel Java Basics - Anfänger-Themen 3
R Verständnisproblem mit Hibernate Java Basics - Anfänger-Themen 2
T Verständnisproblem mit equals() Java Basics - Anfänger-Themen 4
N datei byte für byte auslesen (verständnisproblem) Java Basics - Anfänger-Themen 2
T Verständnisproblem packages/import Java Basics - Anfänger-Themen 9
Chucky Lineare Listen Programm Verständnisproblem Java Basics - Anfänger-Themen 38
D Verständnisproblem Java Basics - Anfänger-Themen 6
S for Schleifen: Verständnisproblem Java Basics - Anfänger-Themen 15
T Vererbung von Attributen und Methoden, Verständnisproblem Java Basics - Anfänger-Themen 4
bernd while-Schleife: Verständnisproblem Java Basics - Anfänger-Themen 7
S verständnisproblem drucken Java Basics - Anfänger-Themen 11
G GridBagLayout: Verständnisproblem Java Basics - Anfänger-Themen 5
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
A JavaFX-Anwendung läuft nicht mit Selenium WebDriver Java Basics - Anfänger-Themen 0
K Mail senden, nachdem Anwendung beendet wurde (gleich wie) Java Basics - Anfänger-Themen 4
P Best Practice Druck aus Java Anwendung in MacOs Java Basics - Anfänger-Themen 0
T Start-Activity für Java Maven Web-Anwendung festlegen Java Basics - Anfänger-Themen 2
J Was mache ich falsch in meiner Java Anwendung? Java Basics - Anfänger-Themen 11
I Java Anwendung auf Android portieren Java Basics - Anfänger-Themen 1
I Java FX GUI Anwendung Java Basics - Anfänger-Themen 30
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
G MapStruct Anwendung vom selbst geschriebenen Formater Java Basics - Anfänger-Themen 4
J Aktuelle Zeit in einer JavaFX Anwendung aktualisieren lassen Java Basics - Anfänger-Themen 4
S If Anwendung Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben