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.
in Java kann ich Klassen ja zum Zeitpunkt des Initialisierens recht elegant überschreiben:
Die Klasse
Java:
class Printer {
public void print(String s) {
System.out.println(s);
}
}
kann also so initialisiert werden
Java:
Printer p = new Printer(){
@Override
public void print(String s) {
System.out.print("HALLO: ");
super.print();
}
}
irgendwo hab ich mal gesehen, dass Methoden von Klassen auch ausserhalb eines Konstruktors überschrieben werden können; in meinem Fall sieht der Auszug aus dem Code so aus:
Java:
Query q = sess.createQuery(query);
List cols = q.list();
und jetzt möchte ich dem Methodenaufruf q.list() irgendwie anhängen, dass das zurückzugebende Element nicht List selbst, sondern eine Ableitung von List ist!
Wie gesagt: ich hab sowas schon irgendwo mal in Java gesehen; komm aber leider nicht mehr auf den Syntax! Kann mir irgendwer weiterhelfen?!
Du kannst die Rückgabe casten, solltest dann allerdings sehr sicher sein, dass die entsprechende Implementierung zurückkommt. Oder du könntest die Rückgabe in eine andere Liste kapseln:
Java:
ArrayList list = new ArrayList(q.list());
Was ich mich dabei jedoch frage: Wieso? Wieso nicht einfach weiterhin gegen das Interface implementieren?
ich würde hier wahrscheinlich eine eigene Klasse schreiben, die deine neue Methode enthält und von der Originalklasse erbt (sofern dies möglich ist...). Dieser Klasse würde ich dann einen Konstruktor verpassen, der das "Originalobjekt" entgegennimmt und zur weiteren Verarbeitung zwischenspeichert.
Also ungefähr so (keine Garantie, dass der folgende Code compilerfehlerfrei ist, habe gerade keine IDE zur Hand):
Java:
public class MyList() {
private List list;
public MyList(List list) {
this.list = list;
}
public void myNewMethod() {
// do something
}
}
Anschließend kannst du diese Klasse ganz normal verwenden. In deinem Code könnte also zum Beispiel etwas stehen wie:
Java:
List list = ... // irgendeine Methode, die eine Liste liefert
MyList myList = new MyList(list);
myList.myNewMethod();
Was du übrigens gemacht hast, ist eine anonyme inner Klasse zu erstellen. Im GUI-Bereich für kleine Listener, die nur ein zwei Zeilen Code haben, sehr beliebt. Überall sonst nicht wirklich schön, weil unflexibel...
Ok. Danke für den Hinweis.
Ich werd es so machen.
Weiß trotzdem irgendwer den Syntax, wie man sich ein OBJEKT (nicht eine Klasse) überschreiben kann?!
Ich bild mir ein, dass Eclipse mir das mal im Zusammenhang mit "Infer generic Arguments" gemacht hat ...
und jetzt möchte ich dem Methodenaufruf q.list() irgendwie anhängen, dass das zurückzugebende Element nicht List selbst, sondern eine Ableitung von List ist!
Einem Objekt zur Laufzeit eine Methode hinzuzufügen dürfte so nicht möglich sein. Vielleicht über Bytecode-Manipulation oder aspektorientierter/funktionaler Programmierung, aber wohl nicht mit Java-Bordmitteln. Zumindest wäre mir das neu.
Wenn du Generics erwähnst: Kann es sein, dass du das Einfügen neuer Methoden mit generischen Methoden/Klassen verwechselst? Galileo Computing :: Java ist auch eine Insel – 7 Generics<T>
Generische Methoden können anhand des entsprechenden Parameters den Rückgabetyp bestimmen. So wird aus der Methode [c]public Object get(int index)[/c] von [c]List[/c] die Methode [c]public String get(int index)[/c] bei der mit dem generischen Typenargument String versehenen Liste [c]List<String>[/c].
Möglich ist dies allerdings nur mit Klassen, die Generics unterstützen bzw. auf deren Verwendung ausgelegt sind. Wenn Query nicht generisch ist, dann kannst du es auch mit Typparametern versehen.