Forum: PC-Programmierung Hinzufügen abgeleiteter Klassen in Java List


von 0Fh (Gast)


Lesenswert?

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

von 0Fh (Gast)


Lesenswert?

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 ;).

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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 :)

von 0Fh (Gast)


Lesenswert?

@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 ;)

von Bernd K. (bem) Benutzerseite


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.