Generics und compareTo
-
Folgendes Problem :
Habe eine generische Klasse Pair die in etwa so aus sieht:public class Pair<T extends Comparable<? super T>, U extends Comparable<? super U>> implements Comparable< Pair<T ,U > > { private T _first ; private U _second ; public int compareTo(Pair<T, U> Value) { if (Utilities.IsNull(Value)) return 1 ; int lastCmp = _first.compareTo(Value.getfirst()); return (lastCmp != 0 ? lastCmp : _second.compareTo(Value.getsecond())); } }
Nun habe ich eine Ableitung dieser Klasse
public class MonthYear extends Pair<Byte,Integer> { // irgendwelcher Code .... public int compareTo(MonthYear Value) { // neue Implementierung von compareTo } }
Nun habe ich eine einfache Util Klasse die folgende Funktion besitzt
public static <A extends Comparable<? super A>> boolean isBetween(A MinValue,A MaxValue,A Value) { return (Value.compareTo(MinValue)>=0 && Value.compareTo(MaxValue)<=0) ; }
Wenn ich nun die Function isBetween mit der Klasse MonthYear teste wird die compareTo Function von Pair aufgerufen. Warum ??
Besten Dank für die Hilfe
-
Weil Generics den Code nicht duplizieren, und Generics vom Compiler entfernt werden (Generics sind nur eine Hilfe für den Programmierer, und haben sonst keine Bedeutung).
Bei dem hier:
return (Value.compareTo(MinValue)>=0 && Value.compareTo(MaxValue)<=0) ;
... sorgt der Compiler für einen Aufruf von "compareTo( Comparable )" (das Interface bietet ja nichts anderes an), "compareTo( MonthYear )" hat eine andere Signatur, und überschreibt dementsprechend das "compareTo( Comparable )" von Pair nicht.