Datentypen Klassenattribut aus Objekt in generischer Liste

DanSc94

Mitglied
Hallo,

ich stehe vor folgendem Problem:
Ich habe eine generische Klasse public MinimalList<T>, in der verschiedene Klassenobjekte gespeichert werden, im Moment für jede Klasse eine seperate Liste. Nun möchte ich auf die Klassenattribute zugreifen, was leider nicht funktioniert.

Wie kann ich das am besten hinkriegen?
 
Wenn ich dich richtig verstanden habe, hast du beispielsweise eine
Java:
public class Banana
, von der du verschiedene Instanzen in einer
Java:
MinimalList<Banana> bananas
gespeichert hast?
Dann solltest du zuerst einmal an das konkrete Banana-Objekt gelangen, vermutlich über ein
Java:
Banana banana = bananas.get(0)
. Nun kannst du über die Variable banana auf die Klasse zugreifen.
Am sinnvollsten wird hier wohl eine Getter-Methode in der Klasse sein.

Ich hoffe, ich hab dein Problem richtig verstanden?
 
Wir sollen in der Klasse MinimalList<T> jedoch mehrere Instanzen aus verschiedenen Klassen speichern.
Insgesamt sind es drei, und man soll jedes beliebiges Objekt in der Liste speichern können.
Java:
public class MinimalList<T> {
    private class ListCell<T> {
        T content;
        ListCell<T> prev;
        ListCell<T> next;
     
        ListCell(T c, ListCell<T> p, ListCell<T> n) {
            this.content = c;
            this.prev = p;
            this.next = n;
        }
     
        public T getContent() {
            return content;
        }
    }
 
    private ListCell<T> first, last;
 
    public MinimalList() {
        this.first = this.last = null;
    }
 
    public void add(T elmt) {
        if (this.first == null) {
            ListCell<T> tmp = new ListCell(elmt, null, null);
            this.first = tmp;
        }
        else {
            ListCell<T> tmp = new ListCell(elmt, last, null);
            this.last.next = tmp;
        }
    }

Nun frage ich mich wie ich aus einem Objekt T(oder spezifisch aus einer ListCell<T>) wieder an die Klassenattribute gelange..
 
Naja prinzipiell kannst du in einer Liste vom generischen Typ T erstmal auch nur Elemente vom Typ T speichern.

Du könntest eine Oberklasse Item für deine zu speichernden Klassen deklarieren und sie alle davon erben lassen. Dann kannst du eine MinimalList<Item> erstellen und alle deine Objekte da reinstecken.
Bei dem Auslesen kannst du dann einen Cast auf die entsprechende Klasse machen und somit auf die Klassenattribute zugreifen.

Das ist keine richtig schöne Variante. Aber eine bessere fällt mir auf die schnelle nicht ein. Ich werde nochmal drüber nachdenken. Vielleicht fällt ja auch jemand anderem was ein.
 
T ist nur ein Platzhalter für einen(!) konkreten Typ. Daher wird es nicht möglich sein einfach 3 beliebige Typen in ein und derselben Liste zu speichern.
Außer wie Naryxus schon erwähnt hat wenn alle von der gleichen Basisklasse ableiten.

Ich glaube es wäre praktisch wenn du die genaue Aufgabenstellung hier posten würdest. Möglicherweise ist es uns dann verständlicher was verlangt ist.
 
Ah, dann kann ich ja einfach MinimalList<T,U,V> benutzen oder nicht? Oder möglicherweise über ein Interface comparable<T>(Wurde in der Vorlesung angesprochen)?

Hier die Aufgabenstellung(Aufgabe B): https://sdqweb.ipd.kit.edu/lehre/WS1516-Programmieren/assignment05.pdf

@Joose: Ich habe jedoch für jede Klasse eine Liste erstellt, sprich eine Liste banks für alle Banken, eine Liste accounts für alle Konten und eine Liste users für alle Kontoinhaber, trotzdem komme ich nicht an die Klassenattribute.. vielleicht mach ich ja nur etwas falsch?
 
Zuletzt bearbeitet:
Ja in der Aufgabe steht die "MinimalList" soll generisch werden. Diese Datenstruktur (Liste) kann man verwenden um Objekte eines beliebigen Datentypen zu verwalten.
Sprich jedes Objekt von MinimalList kann nur Objekte eines bestimmten Typs verwalten. Welcher Typ das ist wird bei der Initialisierung des Objektes angegeben.
Java:
MinimalList<Bank> banks = new MinimalList<Bank>(); // kann nur Bank Objekte enthalten
MinimalList<Account> accounts = new MinimalList<Account>(); // kann nur Account Objekte enthalten
 
Ahh, okay ich denke damit kann ich was anfangen. Ich probier mal weiter aus, vielen Dank dafür!

Muss ich dann MinimalList<Bank, Account, AccountHolder> benutzen oder geht auch MinimalList<T>?
 
Zuletzt bearbeitet:
Ich habe immernoch Probleme auf die Klassenattribute zuzugreifen..
Ich möchte folgendes tun:
Ich will in der Liste users (MinimalList<AccountHolder> users = new MinimalList<AccountHolder>(); ) überprüfen, ob es bereits ein Objekt mit dem Klassenattribut int personalNumber gibt.

Java:
public T getUser(T elmt) {
        ListCell<T> tmp = this.first;
      
        while (tmp != null) {
            if (tmp.content.personalNumber == elmt) {
                return tmp.content;
            }
            tmp = tmp.next;
        }
        return null;
    }

gibt mir immer den Fehler: personalNumber cannot be resolved or is not a field.
 
Ich glaube du vermischst da einiges. Du musst dich von dem Gedanken trennen, dass du in deiner generischen Liste einen bestimmten Typen betrachtest.

Du musst im Prinzip außerhalb über die Liste iterieren.
Java:
public boolean getUser(AccountHolder user) {
   ListCell<AccountHolder> tmp = (ListCell<AccountHolder>) users.first;

   while(tmp != null) {
      if(tmp.content.personalNumber == user.personalNumber)
         return true;
      tmp = tmp.next;
   }

   return false;
}

Diese Methode muss aber woanders als in der Klasse MinimalList liegen. Die Klasse MinimalList weiß erstmal nur, dass sie Elemente vom Typ T enthält. Und kann deswegen nicht darauf schließen, dass sie gerade AccountHolder beinhaltet.
 
Ist auch klar da ListCell eine private innere Klasse von MinimalList ist. Daher kann ListCell nicht außerhalb bekannt sein.

In welcher Klasse steht die Methode "getUser()"? Was wird dieser Methode als Parameter übergeben?
 
Habe ListCell dann auch auf public gesetzt.

getUser() in MinimalList:
Java:
public T getUser(int elmt) {
        ListCell<T> tmp = this.first;
    
        while (tmp != null) {
            if (comparePN(tmp.content, elmt) == true) {
                return tmp.content;
            }
            tmp = tmp.next;
        }
        return null;
    }

comparePN() in AccountHolder:
Java:
public boolean comparePN(AccountHolder user, int personalNumber) {
        if (user.personalNumber == personalNumber) {
            return true;
        }
        return false;
    }

Das habe ich im Moment.. comparePN(T, int) funktioniert aber nicht..
 
UUKfWE8.png

Das wird als Fehler angezeigt.
 
Das eigentliche Thema ist schon gelöst -> aus MinimalList eine generische Klasse zu machen.

Bitte mache für dein aktuelles Problem ("Welche Methode gehört in welche Klasse und warum funktioniert dieses und jenes nicht") einen neuen Thread auf.
Danke!

Dort kannst du nochmal deine aktuellen Code und dein Ziel genau erklären.
 

Neue Themen


Zurück
Oben