Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe eine LinkedList die mit einer Superklasse gefüllt wird. Also der Typ der Liste ist eben die Superklasse damit ich diese auch mit Objekten der Unterklassen füllen kann. Nun möchte ich die Objekte der Liste ausgeben und auf die Methoden der Unterklassen zugreifen. Funktioniert nur nicht so.
Hier nochmal verdeutlicht wie das aussieht:
Meine Superklasse ist "User" die Unterklassen sind "PrivateCustomer", "BusinessCustomer" und "Administrator".
Die Liste wird mit Objekten der Unterklassen gefüllt und ist vom Typ User also:
LinkedList<User> userList = new LinkedList<>();
Nun möchte ich auf die Objekte der Liste zugreifen. Also Iteriere ich durch die Liste mit For each.
for (User user: userList){
}
Das Problem ist jetzt, dass ich auf Methoden der Unterklassen zugreifen will. D.h. wenn es sich grad um ein Objekt der Klasse "PrivateCustomer" möchte ich auch deren Methoden benutzen. Wie mach ich dies am geschicktesten?
Entweder du prüfst jeden einzelnen Typ mit instanceof, castest das Ergebnis und rufst die entsprechenden Methoden auf. Oder du hast eine gemeinsame Methode (in der User Klasse dann abstract), die dann jede Subklasse implementiert.
Analog machst du if-Anweisungen für die anderen Unterklassen.
Solltest du Java8 verwenden kannst du schon von vornerein mittels Stream nach Unterklassen filtern.
Entweder du prüfst jeden einzelnen Typ mit instanceof, castest das Ergebnis und rufst die entsprechenden Methoden auf. Oder du hast eine gemeinsame Methode (in der User Klasse dann abstract), die dann jede Subklasse implementiert.
Du musst dann natürlich zu der richtigen Klasse casten.
Analog machst du if-Anweisungen für die anderen Unterklassen.
Solltest du Java8 verwenden kannst du schon von vornerein mittels Stream nach Unterklassen filtern.
Danke! Ich verwende Java8. Wie filter ich mittels Stream nach Unterklassen? Und wenn die erste Lösung funktioniert warum dann anders machen? Bzw. was ist "besser"?
Die erste Methode ist nicht sehr schön und ist normalerweise ein Zeichen von schlechter Planung.
Deshalb besser die zweiter Methode verwenden:
Java:
abstract class User {
abstract void doSomething();
}
class PrivateCustomer extends User {
void doSomething() {
System.out.println("PrivateCustomer tut etwas.");
}
}
public class Test {
public static void main(String[] args) {
User user = new PrivateCustomer();
user.doSomething();
}
}
userList.stream().filter( u -> u instanceof PrivateCustomer)
.map( u -> (PrivateCustomer) u)
.forEach( pcustomer -> pcustomer.doSomething());
Du könntest dir auch mittels eines Collectors eine Unterliste bilden lassen, dessen Elemente nur
PrivateCustomer-Objekte sind.
Streams geben da viele Vorteile. Auch dass zum Beispiel nicht die ganze Liste durchlaufen wird.
Java handelt das optimiert intern ab.
Natürlich ist die zweite Option schöner. Aber ich kenne den genauen Grund nicht. Vielleicht ist es wirklich eine Methode, die nur diese Unterklasse hat.
Hat zum Beispiel "Administrator" diese Methode nicht, dann müsste man das wiederrum entsprechend abfangen, da du abstrakte Methoden in jeder Unterklasse definieren musst.