T
Throwable
Gast
Hallo allerseits,
ich habe da ein kleinen Codeschnipsel, der Verwendung von Generics macht, den ich aber nicht warnungs- bzw. fehlerfrei bekomme. Ich hab den Code aufs Nötigste reduziert. Sind trotz allem noch 60 Zeilen, aber nicht abschrecken lassen: Die Logik ist sehr simpel.
Kurz um was es geht: Es gibt eine Klasse Component. Aus dieser werden Tupel aufgebaut. Ein Tupel ist einfach ein Array aus Components. Und diese Tupel sollen verglichen werden können. Aber seht selbst:
So gibt es einen Fehler in der vorletzten Zeile, der dadurch gelöst werden kann, dass ich bei der Deklaration der Klasse Component nur <T extends Comparable> schreibe. Dann gibt es jedoch wieder eine Warnung in der Zeile der Klassendeklaration, da Comparable nicht parametrisiert ist. Ich drehe mich schon seit mehreren Stunden im Kreis und komme nicht auf die Lösung. Ist es überhaupt möglichen, diesen Code warnungsfrei zu bekommen? Und wenn nein, wie sähe eine Alternative aus?
ich habe da ein kleinen Codeschnipsel, der Verwendung von Generics macht, den ich aber nicht warnungs- bzw. fehlerfrei bekomme. Ich hab den Code aufs Nötigste reduziert. Sind trotz allem noch 60 Zeilen, aber nicht abschrecken lassen: Die Logik ist sehr simpel.
Kurz um was es geht: Es gibt eine Klasse Component. Aus dieser werden Tupel aufgebaut. Ein Tupel ist einfach ein Array aus Components. Und diese Tupel sollen verglichen werden können. Aber seht selbst:
Java:
public class Demo {
public Demo() {
Component<?>[] tuple1 = new Component<?>[] {
new Component<Integer>(1),
new Component<Float>(1.0f),
new Component<Double>(1.0),
new Component<Character>('L'),
new Component<String>("Lorem ispum dolor sit amet"),
};
Component<?>[] tuple2 = new Component<?>[] {
new Component<Integer>(1),
new Component<Float>(1.0f),
new Component<Double>(1.0),
new Component<Character>('L'),
new Component<String>("Lorem ispum dolor sit amet"),
};
if (isGreaterThan(tuple1, tuple2)) {
System.out.println("Tuple1 is greater than tuple2.");
}
}
public static void main(String args[]) {
new Demo();
}
private boolean isGreaterThan(Component<?>[] tuple1, Component<?>[] tuple2) {
if (tuple1.length < tuple2.length) {
return false;
} else if (tuple1.length > tuple2.length) {
return true;
} else {
for (int i = 0; i < tuple1.length; i++) {
if (tuple1[i].compareTo(tuple2[i]) < 1) {
return false;
}
}
return true;
}
}
}
class Component<T extends Comparable<? super T>> implements Comparable<Component<?>> {
private T value;
public Component(T value) {
super();
this.value = value;
}
public T getValue() {
return value;
}
@Override
public int compareTo(Component<?> o) {
return this.getValue().compareTo(o.getValue());
}
}
So gibt es einen Fehler in der vorletzten Zeile, der dadurch gelöst werden kann, dass ich bei der Deklaration der Klasse Component nur <T extends Comparable> schreibe. Dann gibt es jedoch wieder eine Warnung in der Zeile der Klassendeklaration, da Comparable nicht parametrisiert ist. Ich drehe mich schon seit mehreren Stunden im Kreis und komme nicht auf die Lösung. Ist es überhaupt möglichen, diesen Code warnungsfrei zu bekommen? Und wenn nein, wie sähe eine Alternative aus?