Comparable und Generics

Hi,

ich spiele gerade mit Java Generics rum und hab beim Spielen ein kleines Verständnisproblem.

Ich hab zwei voneinander abgeleitete Klassen C1 und C2. Die Oberklasse implementiert ein Interface, zum Beispiel Comparable<T>. In C1 und C2 muss die CompareTo() Methode unterschiedlich sein.
In einer dritten Klasse hab ich ein Methode die sich auf das CompareTo() von C1 oder C2 abstützt.

Irgendwie bin ich zu blöd das mit Generics richtig hinzubekommen, hier mal mein Code:
[Java]
class FindMax<T extends Comparable<? super T>>
{
public T findMax(T o1, T o2)
{
T max = o1;

if (o1.compareTo(o2) < 0)
{
max = o2;
}
return max;
}
}

class C1 implements Comparable<C1>
{
private int mSize;

public C1 (int aSize)
{
mSize = aSize;
}

public int compareTo(C1 o)
{
System.out.println("CompareTo::C1");
return (mSize - o.mSize);
}

public String toString()
{
return "C1 " + mSize;
}
}

class C2 extends C1
{
private int mValue;

public C2(int aSize, int aValue)
{
super(aSize);
mValue = aValue;
}

public int compareTo(C2 o)
{
System.out.println("CompareTo::C2");
return (mValue - o.mValue);
}

public String toString()
{
return "C2 " + mValue;
}
}


public class TestFindMaxNeu
{
public static void main(String[] args)
{
FindMax<C1> maxi1 = new FindMax<C1>();
C1 c1 = new C1(320);
C1 c2 = new C1(545);

C1 max1 = maxi1.findMax(c1, c2);
System.out.println(max1);
System.out.println("");

FindMax<C2> maxi2 = new FindMax<C2>();
C2 eb1 = new C2(320, 15);
C2 eb2 = new C2(545, 9);

C2 max2 = maxi2.findMax(eb1, eb2);
System.out.println(max2);

System.out.println(eb1.compareTo(eb2));
System.out.println("");

}
}
[/Java]

Der Code kompiliert nur wird beides Mal bei FindMax die compareTo()-Methode in C1 aufgerufen.

Wie muss ich denn den Code ändern damit bei der zweiten Instanz maxi2 auch die compareTo-Methode von C2 aufgerufen wird.

Danke schon mal
Patrick

PS: Anstelle von FindMax könnte auch was ganz kompliziertes stehen. Die Funktion hab ich nur gewählt, weil sie so einfach ist.
 
B

Beni

Gast
compareTo(C1) und compareTo(C2) sind zwei unterschiedliche Methoden. Du musst (leider) auch in deiner zweiten Klasse compareTo(C1) schreiben um die Originalmethode zu überschreiben, dann must Du einen Cast von C1 auf C2 ausführen. Damit geht die Typsicherheit über Bord.

Persönlich ziehe ich es vor, in dieser Situation zweimal das Interface Comparator (je einmal für C1 und für C2) zu implementieren. Das ist dann weiterhin typsicher.
 

fjord

Bekanntes Mitglied
C2 hat die Funktionen [c]compareTo(C1 o)[/c] und [c]compareTo(C2 o)[/c] und erbt von C1 das Interface [c]Comparable<C1>[/c].

Meine Vermutung ist, dass C2 das Interface [c]Comparable<C2>[/c] bräuchte. Das kannst du allerdings nicht implementieren, weil das Interface bereits mit einer anderen Klasse implementiert ist.
 

nrg

Top Contributor
die methodensignatur ist ganz einfach anders. arbeite bei vererbung immer mit @Override. wenn du das in beiden klassen bei der compareTo machst, siehst du auch gleich, dass da was nicht stimmt :)
 
Zuletzt bearbeitet:
Hallo,

erst mal vielen Dank für die Antworten.
Ich muss jetzt nur noch verstehen, warum beim Aufruf über maxi2.findMax(eb1,eb2) die "falsche" compareTo-Methode aufgerufen wird und beim direkten Aufruf eb1.compareTo(eb2) die richtige ...

Ich hab gedacht, dass bei maxi2 das T durch das C2 "ersetzt" wird, also eine Instanz entsteht bei der alle T durch ein C2 ersetzt werden. Irgendwo ist da wohl noch ein Knoten in meinem Hirn ???:L

Gute Nacht
Pat
 

nrg

Top Contributor
generics bieten lediglich eine typsicherheit vor der Laufzeit. intern wird jede List<xy> einfach nur als list interpretiert
 
I

inheritancee

Gast
Wie muss ich denn den Code ändern damit bei der zweiten Instanz maxi2 auch die compareTo-Methode von C2 aufgerufen wird.

compareTo(C1 c1) hinzufügen. Je nachdem, ob zur Laufzeit ein Objekt Typs C2 vorliegt und die Methode mit einem Objekt C1 oder C2 aufgerufen wird, wird dann die entsprechende compareTo()-Methode aus C2 aufgerufen. Es wird die Methode mit der passendsten Signatur gewählt in diesem Fall und der jeweilige Typ der Objekte zur Laufzeit ist entscheidend.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Generics und Comparable Java Basics - Anfänger-Themen 14
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
L Interface & Comparable Java Basics - Anfänger-Themen 15
O Comparable Generic Java Basics - Anfänger-Themen 24
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
N Comparable bzw Comparator Java Basics - Anfänger-Themen 5
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
K Comparable - Objekte aus Array vergleichen und größtes auswählen Java Basics - Anfänger-Themen 1
Shizmo Frage zu Comparable Java Basics - Anfänger-Themen 4
L LinkedList Comparable < > MEHRFACH implementieren? Java Basics - Anfänger-Themen 3
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
F Comparable mit String Java Basics - Anfänger-Themen 5
M Comparable und Comparator nicht ganz klar Java Basics - Anfänger-Themen 1
F Objekte sortieren mit Comparable Java Basics - Anfänger-Themen 9
R Mehrere Interfaces(Comparable, ...) Java Basics - Anfänger-Themen 2
B Comparable & Comparator Java Basics - Anfänger-Themen 9
C Comparable Interface Java Basics - Anfänger-Themen 8
T Interface Interface Comparable Problem... Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Object "Method" in TreeSet, Fehler beim Vergleichen/Comparable Java Basics - Anfänger-Themen 9
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
J Probleme mit Comparable, compareTo() Java Basics - Anfänger-Themen 2
A Comparable interface Java Basics - Anfänger-Themen 26
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
S comparable und equals Java Basics - Anfänger-Themen 7
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
M Frage zum Interface Comparable Java Basics - Anfänger-Themen 3
S Comparable Java Basics - Anfänger-Themen 4
H Comparable und Comparator Java Basics - Anfänger-Themen 22
S instanceof Comparable...geht nicht? Java Basics - Anfänger-Themen 20
M comparable funktion & reverse funktion Java Basics - Anfänger-Themen 8
H Mehrere Comparable Java Basics - Anfänger-Themen 4
S Comparator / Comparable ? Java Basics - Anfänger-Themen 3
D Comparable - Bucketsort / Radixsort? Java Basics - Anfänger-Themen 2
B Mehrere Werte mit Comparable sortieren Java Basics - Anfänger-Themen 14
S String umwandeln in Comparable Java Basics - Anfänger-Themen 6
R Comparable Interface Funktionalität selbst programmieren? Java Basics - Anfänger-Themen 3
A Interface Comparable Java Basics - Anfänger-Themen 2
J Comparable Java Basics - Anfänger-Themen 9
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
frau-u Wie vergleicht Comparable Java Basics - Anfänger-Themen 2
M Comparable - Bedingung erzwingen Java Basics - Anfänger-Themen 3
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben