Generische Klassen "FlaschenRegal"

Mikesh

Mitglied
Hey,

ich möchte gerne eine generische Klasse "Weinregal" implementieren.

Aber von vorne. Ich habe eine generische Klasse Flaschen
Java:
public class Flasche<T extends Fluessigkeit> {
    private String etikett;
    private T inhalt = null;

    public void fuellen(T inhalt) {
        this.inhalt = inhalt;
    }
   
    public void beschriften(String text) {
        etikett = text;
    }
   
    public T gibInhalt() {
        return inhalt;
    }
   
    public String gibEtikett() {
        return etikett;
    }
   
    public T ausleeren() {
        T resInhalt = inhalt;
        inhalt = null;
        return resInhalt;
    }
   
    public boolean istLeer() {
        return inhalt == null;
    }
   
    public String toString() {
        return "Flasche \"" + etikett + "\", " + inhalt;
    }
   
}

In meiner Main fülle ich diese Flaschen mit Inhalt
Code:
Wein Chianti = new Wein("Chianti", 0.7);
        Wein Babera = new Wein("Babera", 1.0);
       
       
        Flasche<Wein> flasche0 = new Flasche<>();
        Flasche<Wein> flasche1 = new Flasche<>();
        Flasche<Wein> flasche2 = new Flasche<>();
        Flasche<Wein> flasche3 = new Flasche<>();
       
        flasche0.fuellen(Chianti);
        flasche1.fuellen(Babera);
        flasche2.fuellen(Chianti);
        flasche3.fuellen(Babera);

Das klappt alles soweit! Ich möchte nun eine weitere generische Klasse FlaschenRegal implementieren . Diesem Regal möchte ich dann gerne meine flasche0 ,flasche1 usw hinzufügen. Das ganz habe ich mir so vorgestellt dass mein Regal durch eine ArrayList oder Array repräsentiert wird.
Java:
import java.util.ArrayList;

public class FlaschenRegal<T extends Fluessigkeit> {

    private T[] regal;
    private int kapazität;
   

    public FlaschenRegal(int kapazität) {
        this.kapazität = kapazität;
       
       

    }
   


   
    public void ablegen(T flasche, int pos){

        regal[pos] = flasche;
       
       
        }
       
    }

Leider funktioniert das so gar nicht. Ich kann auch kein generisches Array vom Typ T generieren. Hat mir jemand einen Denkanstoß, ich bin komplett auf dem Holzweg.

Beste Grüße und ein schönes Wochenende
Mikesh
 

httpdigest

Top Contributor
Mit class FlaschenRegal<T extends Fluessigkeit> gibst du ja auch nicht an, dass das Regal Flaschen enthalten soll, sondern Flüssigkeiten. Du solltest wohl eher schreiben: class FlaschenRegal<T extends Flasche<?>>, um zu sagen: Das ist ein Regal lauter Flaschen mit beliebigen Flüssigkeiten.

Ansonsten stimme ich @Robat zu: Verwende einfach eine existierende Collection Klasse.
 

Mikesh

Mitglied
Okai hab das jetzt mal probiert aber ich steig komplett nicht durch gerade... Das mit extends Flasche dachte ich mir auch schon, aber in der Aufgabe steht es soll extends Flüssigkeiten sein. Habt ihr mir vielleicht einen Fetzen Code der wenigstens zeigt wie ich das mit dem Objekt Array oder List richtig hinbekomme? Reicht auch allgemein. Komm gerade nicht dahinter
 

httpdigest

Top Contributor
Na gut, du kannst den Typparameter natürlich auch für eine Flüssigkeit verwenden, in welchem Fall dein Regal dann eben ein Array von Flasche<T> enthalten kann und du dieses Array dann ensprechend mit Flasche[kapazität] instanziieren könntest.
 

Robat

Top Contributor
Oder noch mal die Variante mit einer Collection
Java:
List<T> regal = new ArrayList<>();
 

Mikesh

Mitglied
Es klappt jetzt zwar aber wirklich überzeugt bin ich von der Sachen noch nicht die ich da gerade fabriziere.
Java:
public class FlaschenRegal<T extends Fluessigkeit > {
   
    private int kapazität;
    private ArrayList <Flasche<T>> regal;
   
   
    public FlaschenRegal(int kapazität){
        this.kapazität = kapazität;
        regal = new ArrayList<>();
   
       
    }

    public void ablegen( Flasche<T> flasche){
        if(regal.size() <= kapazität){
            regal.add(flasche);
           
        }
       
    }
   
    public void ausgabe(){
        for(Flasche element: regal){
            System.out.println(element);
        }
    }

Werde jetzt nochmal die Sache mit den Collections probieren.Dachte eigentlich dass ich die Generischen Klassen einigermaßen verstanden haben, aber das mit diesem Array wirft mich gerade irgendwie aus der Bahn :D
 

Javinner

Top Contributor
Java:
public abstract class AbstractWein
{
    public abstract String getName();
}

public class CabernetFranc extends AbstractWein
{
    @Override
    public String getName()
    {
        return this.getClass().getSimpleName();
    }
   
}
public class CabernetSauvignon extends AbstractWein
{
    @Override
    public String getName()
    {
        return this.getClass().getSimpleName();
    }
}
public class Chianti extends AbstractWein
{
    @Override
    public String getName()
    {
        return this.getClass().getSimpleName();
    }
}
public class Dornfelder extends AbstractWein
{
    @Override
    public String getName()
    {
        return this.getClass().getSimpleName();
    }
}
public class Merlot extends AbstractWein
{
    @Override
    public String getName()
    {
        return this.getClass().getSimpleName();
    }
}
/**
 * Den Spass am Einfuegen an einer bestimmten Stelle will ich dir nicht nehmen.
 * Schau dir dafuer "Datenstrukturen und Algorithmen" in "Java ist auch eine Insel" an
 */
public class WeinSchrank<T extends AbstractWein>
{
    private final List<T> wein_liste = new ArrayList<>();
    public void inDenWeinschrank(T t)
    {
        wein_liste.add(t);
    }
    public void ausDemWeinschrank(T t)
    {
        wein_liste.remove(t);
    }
    public void gibDenWeinschrankInhalt()
    {
        for (T t : wein_liste)
        {
            System.out.println(t.getName());
        }
    }
}
Java:
public class Weinkeller
{

    public static void main(String[] args)
    {
        List<AbstractWein> wein_liste = new ArrayList<>();
        wein_liste.add(new CabernetFranc());
        wein_liste.add(new CabernetSauvignon());
        wein_liste.add(new Chianti());
        wein_liste.add(new Dornfelder());
        wein_liste.add(new Merlot());

        WeinSchrank<AbstractWein> weinschrank = new WeinSchrank<>();
        int soll_inhalt_an_flaschen = 100;
        for (int i = 0; i < soll_inhalt_an_flaschen; i++)
        {
            int x = (int) (Math.random() * wein_liste.size());
            weinschrank.inDenWeinschrank(wein_liste.get(x));
        }

        weinschrank.gibDenWeinschrankInhalt();

    }

}
 

MoxxiManagarm

Top Contributor
Java:
public abstract class AbstractWein
{
    public abstract [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] getName();
}

public class CabernetFranc extends AbstractWein
{
    @Override
    public [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] getName()
    {
        return this.getClass().getSimpleName();
    }
  
}
public class CabernetSauvignon extends AbstractWein
{
    @Override
    public [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] getName()
    {
        return this.getClass().getSimpleName();
    }
}
public class Chianti extends AbstractWein
{
    @Override
    public [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] getName()
    {
        return this.getClass().getSimpleName();
    }
}
public class Dornfelder extends AbstractWein
{
    @Override
    public [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] getName()
    {
        return this.getClass().getSimpleName();
    }
}
public class Merlot extends AbstractWein
{
    @Override
    public [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] getName()
    {
        return this.getClass().getSimpleName();
    }
}

Das ist etwas wo ich überhaupt nicht konform gehe.
Wozu x Klassen erstellen, welche sich nur im Klassennamen unterscheiden?

Da ist es doch deutlich besser nur die Klasse Wein zu erstellen welche die Eigenschaft "typ" hat. Diese Eigenschaft kann auch ein Enum sein. Der Typ wird entsprechend im Konstruktor mitgegeben.
 

Javinner

Top Contributor
@MoxxiManagarm
Diente nur der Veranschaulichung, weil es eben um <T extends Something> ging. Ein Enum ist gut und sehr praktisch, jedoch würde ich hier den Weg über XML gehen, schon der Wiederverwendbarkeit wegen.
 

Mikesh

Mitglied
Da ich nicht einfach Code kopieren wollte, hab ich selber nochmal an meinem Code gebastelt. Die Regalklasse sieht nun wie folgt aus.
Java:
import java.lang.reflect.Array;
import java.util.ArrayList;

public class FlaschenRegal<T extends Fluessigkeit> {

    private int kapazität;
    private Flasche<T>[] regal;

    @SuppressWarnings("unchecked")
    public FlaschenRegal(int kapazität) {
        this.kapazität = kapazität;
        regal = new Flasche[kapazität];

    }

    public void ablegen(Flasche<T> flasche, int pos)
            throws IllegalArgumentException {
        if (regal[pos] == null) {
            regal[pos] = flasche;
        } else {
            throw new IllegalArgumentException();
        }
    }

    public Flasche<T> entnehmen(int pos) throws IllegalArgumentException {
        if (regal[pos] == null) {
            throw new IllegalArgumentException();

        }
        Flasche<T> tmp = regal[pos];
        regal[pos] = null;
        return tmp;

    }

    public void ausgabe() {
        for (Flasche<T> flasche : regal) {
            if (flasche == null) {
                System.out.println("leer");
            } else {

                System.out.println(flasche.gibInhalt());
            }
        }

    }

    public double gesamtvolumen() {
        double liter = 0;
        for (Flasche<T> flasche : regal) {
            if (flasche != null) {
                liter += flasche.gibInhalt().gibLiter();

            }
        }return liter;

    }
    public boolean istFrei(int pos){
        if(regal[pos] == null){
            return true;
           
        }else{
            return false;
        }
    }
    public int kapazitaet(){
        return regal.length;
    }

}
 

httpdigest

Top Contributor
Ja, passt. Zwei Sachen nur noch:
1. Anscheinend brauchst du private int kapazität; nicht. Die Kapazität des Arrays nimmst du ja direkt aus array.length
2. Du könntest:
Java:
public boolean istFrei(int pos){
  if (regal[pos] == null) {
    return true;
  } else {
    return false;
  }
}
refactoren zu: return regal[pos] == null;
Das geht immer, wenn du if-Anweisungen der Form: if (c) return true/false; else return false/true; hast.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
H linkedlist generische klassen Java Basics - Anfänger-Themen 169
S Erste Schritte Generische Klassen sind toll ....aber warum sollte ich das je benutzen? Java Basics - Anfänger-Themen 3
M Klassen Generische Klassen, Personen und Gruppen Java Basics - Anfänger-Themen 6
W Generische Klassen Java Basics - Anfänger-Themen 3
W Generische Klassen und Casting Java Basics - Anfänger-Themen 6
C Generische Klassen, das erste Mal. Java Basics - Anfänger-Themen 8
J generische klassen neue Instanz Java Basics - Anfänger-Themen 5
H Generische Klassen. Java Basics - Anfänger-Themen 16
I Generische Funktion Java Basics - Anfänger-Themen 3
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
H Generische Konstruktor Java Basics - Anfänger-Themen 12
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14
D Generische Klasse Java Basics - Anfänger-Themen 6
M Datentypen Generische Datentypen - Syntax Java Basics - Anfänger-Themen 25
O Generische Typen Java Basics - Anfänger-Themen 9
Queiser Datentypen 2 generische Datentypen für eine Schnittstelle Java Basics - Anfänger-Themen 1
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
J Sortierte generische Liste Java Basics - Anfänger-Themen 1
D statische generische Methoden Java Basics - Anfänger-Themen 3
S Wie muss ich die Generische Methode schreiben? Java Basics - Anfänger-Themen 6
M Methoden Generische Klasse - ändern einzelner Attributwerte Java Basics - Anfänger-Themen 2
S generische methode mit verschiedenen datentypen Java Basics - Anfänger-Themen 3
N Generische Schnittstellen Java Basics - Anfänger-Themen 2
B generische LinkedList nach Häufigkeit der Elemente füllen Java Basics - Anfänger-Themen 6
D Generische Typen Java Basics - Anfänger-Themen 20
L Generische Liste Java Basics - Anfänger-Themen 4
B Generische Queue programmieren Java Basics - Anfänger-Themen 5
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
A Probleme mit MergeSort Generische Liste Java Basics - Anfänger-Themen 0
A Generische Methode Java Basics - Anfänger-Themen 4
H Collections List in List<SpecificType> als stat. generische Methode zurückgeben Java Basics - Anfänger-Themen 4
J Probleme mit static generische Klasse Java Basics - Anfänger-Themen 6
M Generische Liste Java Basics - Anfänger-Themen 4
B Generische Methode Java Basics - Anfänger-Themen 2
B Generische Klasse Java Basics - Anfänger-Themen 7
B Generische Methoden Java Basics - Anfänger-Themen 8
F Collections Generische Klasse/Methoden Java Basics - Anfänger-Themen 19
L Generische Warteschlange Java Basics - Anfänger-Themen 8
A Generische Datentypen Java Basics - Anfänger-Themen 8
bluerob generische ArrayList -> erbende Objekte auslesen Java Basics - Anfänger-Themen 24
L Generische Containerklasse Java Basics - Anfänger-Themen 9
V Methoden Umwandlung in generische Methode Java Basics - Anfänger-Themen 8
A Generische Collections und Vererbung Java Basics - Anfänger-Themen 2
S Generische HashMap Java Basics - Anfänger-Themen 2
L Generische ArrayList, CastProblem Java Basics - Anfänger-Themen 2
W generische Module Java Basics - Anfänger-Themen 2
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
C unterschied generische typen und supertypen als methodenparameter Java Basics - Anfänger-Themen 3
D Datentypen Generische Collections und Warnings Java Basics - Anfänger-Themen 8
F Generische Methoden Problem Java Basics - Anfänger-Themen 5
E Generische Arrays durch Typecast mit Object-Array Java Basics - Anfänger-Themen 11
K Generische Klasse mit innerer Klasse | Problem mit Array Java Basics - Anfänger-Themen 6
B Was passiert, wenn eine konkrete Klasse von generische Klasse erbt? Java Basics - Anfänger-Themen 14
B Generische Vererbung was ist der Unterschied? Java Basics - Anfänger-Themen 4
F Generische Typen auch für statische Methoden? Java Basics - Anfänger-Themen 13
J array über generische arraylist Java Basics - Anfänger-Themen 7
B instanceof Prüfung für generische Typen Java Basics - Anfänger-Themen 5
N 2 dimensionale generische Arrays Java Basics - Anfänger-Themen 9
H Statische generische Methode Java Basics - Anfänger-Themen 2
G Frage zum Ungang mit Generische Datentypen Java Basics - Anfänger-Themen 4
0x7F800000 generische arrays mal wieder )-; Java Basics - Anfänger-Themen 6
D generische methode <T> void . Java Basics - Anfänger-Themen 9
J Generische Methoden Java Basics - Anfänger-Themen 6
G Doppelt verkettete, generische Liste Java Basics - Anfänger-Themen 11
S Parameterübergabe: Generische Klasse Java Basics - Anfänger-Themen 4
S generische Felder Java Basics - Anfänger-Themen 2
P Generische Klasse Java Basics - Anfänger-Themen 8
F Generische Methode - was bringt der Wildcard Operator? Java Basics - Anfänger-Themen 7
F Generische Liste von generischen Objekten. Java Basics - Anfänger-Themen 3
H generische Methoden Java Basics - Anfänger-Themen 5
N generische HashMap und Iterator Java Basics - Anfänger-Themen 2
H generische Bausteine, heterogene Datenstrukturen Java Basics - Anfänger-Themen 2
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben