www.mikrocontroller.net

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


Autor: 0Fh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: 0Fh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;).

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...
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 :)

Autor: 0Fh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Bernd Klier (bem) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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/j...
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...)

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/j...) 
welche viele Standardaufgabe löst (sortieren, mischen, min/max...) und 
jeweil ein Objekt welches dieses Interface implementiert aktzeptiert.

Wenn du also eine Methode hast:
public void tueEtwasTolles(ArrayList<T> list);
Ist das für den Aufrufer etwas blöde weil er immer eine ArrayList 
übergeben muß.
Bei
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.