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.
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.