Generische Containerklasse

Loppi

Mitglied
Hallo,
ich habe gerade ein ganz einfaches Problem (denke ich jedenfalls mal).
Und zwar habe ich folgende drei Klassen: Mensch(String name), Tier(String name), Container.
Die Container-Klasse hat eine ArrayList, in der beliebig viele Menschen und Tiere sein können und sie soll eine Methode haben, die nach Benutzereingabe abgleicht, ob ein Mensch/Tier mit dem eingegebenen Namen in der ArrayList ist.

An sich hört sich das ganz einfach an, aber mein Problem ist jetzt, dass ich es nicht schaffe, die ArrayList so zu definieren, dass ich noch auf die getter-Methoden von Mensch und Tier zugreifen kann.

Das hier ist erstmal meine Containerklasse:

Code:
public class Container<T>
{
   ArrayList<T> meineLeute = new ArrayList();
   
   public void insertTyp(T einTyp)
   {   
      meineLeute.add(einTyp);
   }
}

Wenn ich jetzt z.b. das hier schreibe:
Code:
String test = meineLeute.get(0).getName()
kommt natürlich, dass die Methode getName() nicht gefunden werden kann, da der Typ T nunmal keine solche Methode hat.

Wie also definiere ich diese ArrayList so, dass ich auf die getter-Methoden von Mensch und Tier zugreifen kann (ohne eine Oberklasse "Lebewesen" zu machen, um die ArrayList durch den Typ zu definieren)?
 

bERt0r

Top Contributor
Du kannst (solltest zumindest) nicht einfach zwei verschiedene Klassen in eine Collection packen. Gerade bei Klassen wie Mensch und Tier bietet sich doch eine Oberklasse Lebewesen an, die gewisse Funktionalitäten (getName() z.b) generalisieren kann, und von der Mensch und Tier erbt. Dann kannst du dir eine ArrayList<Lebewesen> bauen.
Wenn du jetzt alle Lebewesen in deiner ArrayList auf Namen vergleichen willst schreibst du:
Java:
public boolean checkListForName(ArrayList<Lebewesen list, String name)
{
for(Lebewesen l: list)
{
if(l.getName().equals(name))
{return true;}
}
return false;
}
 
N

nillehammer

Gast
Wie also definiere ich diese ArrayList so, dass ich auf die getter-Methoden von Mensch und Tier zugreifen kann (ohne eine Oberklasse "Lebewesen" zu machen, um die ArrayList durch den Typ zu definieren)?
Du musst bei der Definition der Liste einen Typen angeben, der Dir die gewünschten Getter (also z.B. getName) als Methoden zur Verfügung stellt. Wenn Du keine gemeinsame Oberklasse "Lebewesen" definieren willst, dann tut es auch ein Interface (z.B. "Named"), das die Methode getName definiert und das die Klassen Tier und Mensch implementieren. Das greift nicht so stark in die Klassenhirarchie ein, wie eine Oberklase.
[Java]
public interface Named {
public String getName();
}

public class Tier implements Named {...}
public class Mensch implements Named {...}

// und dann im Code

// Das stand vorher drinen. Ist natürich Quatsch! Dank an bygones!
// List<? extends Named> namedBeings = new ArrayList<? extends Named>;

//Korrigierte Version nach bygones' Hinweis.
List<Named> namedBeings = new ArrayList<Named>();
...
[/Java]
Wenn Du auch das nicht willst. Dann lautet die Antwort auf Deine Frage: Geht nicht. Eine typsichere Liste mit gemischten Typen ist nicht möglich. Hier kannst Du dann nur wie früher mit einer ungetypten Liste arbeiten und die Elemente casten.
 
Zuletzt bearbeitet von einem Moderator:
B

bygones

Gast
oder man überschreibt equals und benutzt List#contains
dass funktioniert aber nicht in seinem beispiel, da er einen String hat und damit ein Lebewesen sucht., equals ueberschreiben und contains nutzen geht nur bei gleichen Typen.

@nillehammer:
deine idee ist nett, funktioniert aber leider gar nicht.

Zum einen kannst du keine [c]new ArrayList<? extends Named>[/c] schreiben, sondern es muss [c]new ArrayList<Named>()[/c] sein.
Weiterhin kannst du bei List<? extends Named> list, kein add nutzen, da der compiler dir nicht erlaubt eine unterklasse hinzufuegen

Lass das ? extends weg und dann gehts
 

nrg

Top Contributor
dass funktioniert aber nicht in seinem beispiel, da er einen String hat und damit ein Lebewesen sucht., equals ueberschreiben und contains nutzen geht nur bei gleichen Typen.

jo hast du recht, hatte es ehrlich gesagt nur überflogen. wobei man nen string auch auf die schnelle in ein lebewesen gewrappt bekommt. frage ist dann nur, ob die equals dann nicht zu ungenau ist
 
N

nillehammer

Gast
bygones hat gesagt.:
@nillehammer:
deine idee ist nett, funktioniert aber leider gar nicht.
...
Lass das ? extends weg und dann gehts
Jo, hast natürlich Recht. Das war vollkommener Blösinn. Habe den Code freihändig getippt. Deswegen ist es mir nicht aufgefallen. Habe es jetzt korrigiert (natürlich mit Hinweis auf Dein Urheberrecht ;) ).
 
Zuletzt bearbeitet von einem Moderator:

Loppi

Mitglied
Vielen Dank für die Antworten.
Habe beides probiert und das mit der Schnittstelle finde ich ein wenig eleganter, da ich eben, wie bereits gesagt wurde, damit nicht so wirklich an der Klassenhierachie rumfusche, was ich ja nicht möchte.

Die Oberklasse "Lebewesen" wollte ich übrigens nur nicht, weil in der Aufgabenstellung nur die beiden Unterklassen erwähnt werden. :)
 
N

nillehammer

Gast
Loppi hat gesagt.:
Die Oberklasse "Lebewesen" wollte ich übrigens nur nicht, weil in der Aufgabenstellung nur die beiden Unterklassen erwähnt werden.
Ich könnt wetten, dass sie nur deswegen nicht erwähnt wude, weil Dein Prof. wollte, dass Ihr selbst auf diese Möglichkeit kommt. Mit der interface Lösung und Deiner Erklärung dazu solltest Du ihn um so mehr beeindrucken:).
 

Loppi

Mitglied
Ich könnt wetten, dass sie nur deswegen nicht erwähnt wude, weil Dein Prof. wollte, dass Ihr selbst auf diese Möglichkeit kommt. Mit der interface Lösung und Deiner Erklärung dazu solltest Du ihn um so mehr beeindrucken:).

Die Lösung habe ich sogar direkt anfangs realisiert, weil ich eben keine Möglichkeit gesehen habe, das anders zu lösen.
Ich denke aber, ich werde da gar keinen beeindrucken, da es nur um Klausurvorbereitung geht. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Generische Funktion Java Basics - Anfänger-Themen 3
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
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
H linkedlist generische klassen Java Basics - Anfänger-Themen 169
M Datentypen Generische Datentypen - Syntax Java Basics - Anfänger-Themen 25
O Generische Typen Java Basics - Anfänger-Themen 9
M Generische Klassen "FlaschenRegal" Java Basics - Anfänger-Themen 13
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
S Erste Schritte Generische Klassen sind toll ....aber warum sollte ich das je benutzen? Java Basics - Anfänger-Themen 3
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
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
M Klassen Generische Klassen, Personen und Gruppen Java Basics - Anfänger-Themen 6
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
W Generische Klassen Java Basics - Anfänger-Themen 3
W Generische Klassen und Casting Java Basics - Anfänger-Themen 6
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
C Generische Klassen, das erste Mal. 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 generische klassen neue Instanz Java Basics - Anfänger-Themen 5
H Generische Klassen. Java Basics - Anfänger-Themen 16
P JList, aus selectedValue bestimmten Wert aus Containerklasse auslesen Java Basics - Anfänger-Themen 4
W Java Containerklasse Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben