Frage zur konkreten Methodenimplementierung

Jetzt verstehe ich die Frage nicht - wodrauf möchtes du den raus.

Code 1 sortiert ein Array

Code 2 erstellt eine Liste

möchtest du die Liste sortieren ?
 
Hallo melmager,

Du hast mir beim Code 1 super erklärt, dass dort eine Erzeugung einer namenlosen Klasse stattfindet. Soweit so gut. Nur verstehe ich noch nicht, warum dabei es nicht so aussieht
new Comparator<>()

Also, es fehlen die Spitzenklammern. Man sieht, dass im Code 2 die Spitzenklammern dran sind.

Schönen Dank,

Eure Ratna
 
Ok - soweit ich das verstanden habe (also unter Vorbehalt)

bedeutet ein weglassen der spitzen Klammern alle Objekte

wenn du sicherstellen willst das nur dogs sortiert werden können dann kannst du tatsächlich

Arrays.sort(Datei, new Comparator<Hund>() {public int compare(Hund a, Hund b) {

machen

oder kurz keine Spitzen Klammern entsprechen <Objekt X>

(zu 50% sicher :-) )
 
mhh.. du meinst so etwas:

Arrays.sort(Datei, new Comparator<Object>() {public int compare(Object a, Object b) {

?

Hier habe ich eine Folgefrage --> Object als Datentyp zu wählen ist eigentlich sehr schlau oder? Da Object ja quasi die Mutter aller Klassen. Deswegen passt jede Klasse. Ist das eigentlich der Hintergrund, warum hier Object genommen wird, statt MeinHandler? -Siehe Originalcode im Beitrag 1-

Schöne Grüße,

Eure Ratna
 
@melmager: die Spitzen Klammern ohne Inhalt heißen „Diamond-Operator“ (oder auch eingedeutscht „Diamantoperator“) und kann dort verwendet werden, wo der Compiler den Typ sowieso schon kennt. Statt (wie bisher verpflichtend, jetzt immer noch möglich)
Java:
List<Hund> hunde = new ArrayList<Hund>();
zu schreiben, kann man jetzt
Java:
List<Hund> hunde = new ArrayList<>();
schreiben. Diese Vereinfachung wurde in Java 7 eingeführt um unnötigen Schreibaufwand zu reduzieren. Siehe auch Java ist auch eine Insel, Kapitel 9.1.5


Stattdessen ist
Java:
List hunde = new ArrayList();
gleichbedeutend mit
Java:
List hunde = new ArrayList<Object>();
,
Java:
List<Object> hunde = new ArrayList<Object>();
und
Java:
List<Object> hunde = new ArrayList<>();
, wo jeweils kein Typ festgelegt ist. Da Object die Klasse ist, von der alle anderen erben, ist diese Festlegung zu vermeiden. Um die Typsicherheit auszunutzen, versucht man, den Typ so stark wie möglich zu beschränken. Den Typ auf Object zu beschränken entspricht gar keiner Beschränkung und ist somit überflüssig.


Zu dem Code von oben,
Java:
Arrays.sort(Datei, new Comparator() {
    public int compare(Object a, Object b) {
        meinHandler f1 = new meinHandler((String) a);
            meinHandler f2 = new meinHandler((String) b);
            if (f1.date.compareTo(f2.date) != 0) {
                return f1.date.compareTo(f2.date);
            } else {
                return f1.dateiart.compareTo(f2.dateiart);
            }
        }
    })
ist noch zu sagen: Der Comparator, der hier erzeugt wird (und die Methode compare() erhält) ist eine sogenannte anonyme innere Klasse (siehe auch Kapitel 7.5 der Java-Insel)
 
Zuletzt bearbeitet:
Hallo genodeftest,

dann stimmt vielleicht mein Betrag?

du meinst so etwas:

Arrays.sort(Datei, new Comparator<Object>() {public int compare(Object a, Object b) {

?

Hier habe ich eine Folgefrage --> Object als Datentyp zu wählen ist eigentlich sehr schlau oder? Da Object ja quasi die Mutter aller Klassen. Deswegen passt jede Klasse. Ist das eigentlich der Hintergrund, warum hier Object genommen wird, statt MeinHandler? -Siehe Originalcode im Beitrag 1-

aber warum wird hier Object als Datentyp genommen:

Code:
public int compare(Object a, Object b) {

statt
Code:
public int compare(meinHandler a, meinHandler b) {

?

dank des Hinweises von genodeftest aus dem Buch Java ist auch eine Insel:

new Schnittstellenname() { ... }. Steht hinter new der Name einer Schnittstelle, dann erbt die anonyme Klasse von Object und implementiert die Schnittstelle Schnittstellenname. Implementiert sie nicht die Operationen der Schnittstelle, ist das ein Fehler; wir hätten nichts davon, denn dann hätten wir eine abstrakte innere Klasse, von der sich kein Objekt erzeugen lässt.

Deswegen ist es:

Code:
public int compare(Object a, Object b) {

Danach ist folgendes:

Code:
            meinHandler f1 = new meinHandler((String) a);
            meinHandler f2 = new meinHandler((String) b);
            if (f1.date.compareTo(f2.date) != 0) {
                return f1.date.compareTo(f2.date);

wieso kann hier die Methode compareTo verwendet werden? Oben ist doch ein Objekt von Comparator, nicht Comparable. compareTo ist doch eine Methode von der Klasse Comparable, oder?

ach, ich bin ja blöd.. sorry sorry.. ist klar.. compareTo ist die Methode von meinHandler.. Alles klar!
 
Dazu, ob es schlau ist, Object als Typ zu nehmen:
Du hast recht, dass alles reinpasst, weil Object in der Vererbung an oberster Stelle steht.
Für so Sachen wie Vergleichsmethoden, die mit beliebigem Zeug funktionieren sollen, ganz toll.

Aber der Nachteil dran: Da ja wirklich alles reinpassen muss kann man (ohne casten etc.)
keine Methoden aufrufen, die nicht schon in Object selbst vorhanden sind.
Wenn der Hund ein bellen() hat geht in einer Objectvariable drin kein Aufruf,
weil es ja unendlich viele Klassen geben könnte (und gibt), die kein bellen() haben.
(Und das wenige von Object selbst ist zwar alles hilfreiches Zeug,
reicht aber nicht zum programmieren).

Also nicht jetzt immer Object nehmen, weils so universell ist.
Sachen vergleichen, sortieren usw.usw gut, aber die angebotenen Sachen der Klasse verwenden...

Und bitte den Bearbeitenbutton verwenden.
 
Hallo sheel,

danke.
Nur damit ich richtig verstanden habe. Das heißt, folgende Methode meckert der Compiler?


public int compare(Object a, Object b) {
a.bellen();
}

Hund hundObjekt_01 = new Hund();
Hund hundObjekt_02 = new Hund();
Hund hundObjekt_03 = new Hund();
hundObjekt_03.compare(hundObjekt_01, hundObjekt_02);
 
Genau.
Für und b kann man nur das verwenden, was jedes Object hat,
damit sichergestellt ist, dass beim Übergeben auch jedes beliebige Object funktioniert.

Wenn man bellen braucht,
a) entweder compare(Hund a, Hund b) draus machen.
Dann kann man eben nur Hunde und davon abgeleitete Sachen übergeben.

b) Casten: ((Hund)a).bellen();
Wenn es dann doch kein Hund ist kommt eine Exception.
Aber man kann immerhin mal prinzipiell mehr als Hunde übergeben.

Wenn man dann von irgendwo noch eine Info herbekommt,
ob es ein Hund/Katze/anderes Object oder sowas ist,
kann man entsprechend reagieren.

Man kann a auch auf Hund-sein prüfen, bevor man es wirklich castet,
und wenns nichts passt eben was Anderes machen usw.
 
vielen Dank sheel, super erklärt.

b) Casten: ((Hund)a).bellen();
Wenn es dann doch kein Hund ist kommt eine Exception.
Aber man kann immerhin mal prinzipiell mehr als Hunde übergeben.

finde ich irgendwie sehr witzig ;)
Klingt nach Mogelpackung:rolleyes:

Gute Nacht Dir..

Schöne Grüße aus Rheinland,

Eure Ratna
 
Zurück