Hallo, ich komme eigentlich aus der C/C++ Ecke und muss nun mit Java arbeiten. Das trägt wahrscheinlich zu dem Problem bei, bei dem mir hoffentlich jemand helfen kann. Also: Ich habe eine abstrakte Basisklasse "CommandHandler": public abstract class CommandHandler { public abstract int ZuUeberladen(); } und leite davon zwei "Spezialisten" ab: public class CallCommandHandler extends CommandHandler{ public int ZuUeberladen() {return 0; } } public class SearchCommandHandler extends CommandHandler{ public int ZuUeberladen() {return 1; } } Nun möchte ich alle meine "Spezialisten" in einer Liste zusammenfassen. Also habe ich diese für den Typ der Basisklasse angelegt: List<CommandHandler> mAlleHandler; Sobald ich aber nun versuche einen Handler hinzuzufügen, schmiert mein Programm ab bei: mAlleHandler.add(new CallCommandHandler()); Das ganze passiert in Eclipse und soll eigentlich eine Anwendung für Android werden. Leider kann ich auf den ersten Blick keine aussagekräftige Fehlermeldung finden. Das Eclipse wechslet beim steppen der betroffen Anweisung auf eine leere Seite und schreibt "No Source". Das Handy sagt das mein Programm beendet wurde. Ich würde mich freuen, wenn mir jemand weiter helfen kann. Viele Grüße
Vergesst es... ich glaube es ist einfach zu spät. Ich hatte mein Listenobjekt noch nicht initialisiert: List<CommandHandler> mAlleHandler = null; Hoffe es hat noch keiner sein Hirn zermartert, zumal man das Problem aus dem voherigen Post nicht erkennen kann ;).
0Fh schrieb: > List<CommandHandler> mAlleHandler = null; Nein! Damit wird es zwar initialisiert (eigentlich sollte es ohne nicht mal compilieren!) aber du erhälst kein gltiges Objekt...
1 | List<CommandHandler> alleHandler = new ArrayList<CommandHandler>(); |
0Fh schrieb: > ich komme eigentlich aus der C/C++ Ecke Ist aber keine Entschuldigung für die mXyzABzIntPointerLister Schreibweise ;) Gerade mit Eclipse unter Java unötig und macht es eigentlich nur schwerer zu lesen. 0Fh schrieb: > und muss nun mit Java arbeiten Na mit der Einstellung kommt auch wenig Freude auf, etwas mehr Freude bitte wenn man die Chance erhält etwas neues zu lernen :)
@Läubi: Ich glaube wir meinen dasselbe. Der Code in meinem Post ist enthält noch die "alte" null-Initialisierung. Nun ist es so initialisiert, wie du geschrieben hast: List<CommandHandler> alleHandler = new ArrayList<CommandHandler>(); Dazu hätte ich allerdings noch eine Frage: Warum ein "ArrayList". Ich weiß das es sich mit "= new List<CommandHandler>(); weigert. Aber wieso? Gut evtl. hat List keinen Default Konstruktor... aber warum dann ein ArrayList nehmen? Das "muss Java" lernen ist etwas Selbstironie. Eigentlich ist es nett was neues zu lernen, nur im Moment stressig ;)
0Fh schrieb: > Ich > weiß das es sich mit "= new List<CommandHandler>(); weigert. Aber wieso? Weil java.util.List ein Interface ist. Referenztypvariablen vom Typ eines Interfaces sind erlaubt, jedoch musst du es mit einer konkreten Implementierung (hier z.B. ArrayList) initialisieren. HTH Bernd
0Fh schrieb: > Ich weiß das es sich mit "= new List<CommandHandler>(); weigert. > Aber wieso? ALs ich mit Java begonnen habe hat mir die API von (damals noch sun) ganz gute Dienste geleistet, wenn du da bei List reinschaust: http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html SIehst du das es sich um ein Interface handelt. Ein Interface selbst ist aber nur eine leere Hülle vergleichbar mit einer Headerdatei welche nur die Deklaration enthält. Unter "All Known Implementing Classes" werden dir einige Implementierungen aufgeführt welche du nutzen kannst, theoretisch könntest du natürlich auch deine eigene liefern. > Dazu hätte ich allerdings noch eine Frage: Warum ein "ArrayList". Wie oben beschrieben gibt es noch andere Implementierungen, in der Jeweiligen Beschreibung steht dann drinn was die Besonderheiten sind, ArrayList ist eigentlich ein "Allrounder". (Siehe auch http://download.oracle.com/javase/1.5.0/docs/guide/collections/index.html) Der Vorteil hier ein Interface zu nehmen anstelle der konkreten Klasse ist, das du die Implementierung tauschen kannst ohne deine Schnittstelle nach außen verändern zu müssen. Das sieht man sehr schön an der Klasse Collections (http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html) welche viele Standardaufgabe löst (sortieren, mischen, min/max...) und jeweil ein Objekt welches dieses Interface implementiert aktzeptiert. Wenn du also eine Methode hast:
1 | public void tueEtwasTolles(ArrayList<T> list); |
Ist das für den Aufrufer etwas blöde weil er immer eine ArrayList übergeben muß. Bei
1 | public void tueEtwasTolles(List<T> list); |
hingegen geht auch ein Vektor... Wenn man also nicht die speziellen Methoden einer Klasse benötigt sollte man immer als Typ die "höchstmögliche" Basisklasse oder Interface nutzen, das macht das Leben bedeutend einfacher.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.