Hallo ich habe das Problem das ich nicht weiß wie ich folgendes lösen kann:
Ich habe eine Liste mit Elementen vom Typ T und eine Methode die ein Element von Typ T zurückgeben kann. Zusätzlich kann diese Liste eine Stringrepräsentation zurückgeben, welche aber aufgrund zwei verschiedener Verfahren erfolgen kann:
Der zweite Fall ist relativ einfach, weil der Typ T alles sein darf und nur diese Klasse, welche das „übersetzt“ muss eine Liste mit Elementen vom Typ T akzeptieren. Aber beim ersten Fall verzweifle ich gerade, weil ich kann im Konstruktor nicht sagen, dass die Liste vom Typ T und vom Typ „Interface welche den Text zurück gibt“ sein muss.
So sieht aktuell die Implementierung aus:
Der Fehler lautet:
Vielleicht hat jemand eine bessere Idee das umzusetzen, nur möchte ich nicht „Object.toString()“ nutzen um den Text für jeden Eintrag zurückzugeben. Und die Namen für die Klassen/Schnittstellen sind auch noch nicht endgültig, aber erstmal will ich das Problem los werden.
Fabian
Ich habe eine Liste mit Elementen vom Typ T und eine Methode die ein Element von Typ T zurückgeben kann. Zusätzlich kann diese Liste eine Stringrepräsentation zurückgeben, welche aber aufgrund zwei verschiedener Verfahren erfolgen kann:
- Die Einträge der Liste implementieren ein bestimmtes Interface (T extends Interface)
- Es gibt eine Klasse, die den Text für jeden Eintrag der Liste zurückgibt (T darf "alles" sein)
Der zweite Fall ist relativ einfach, weil der Typ T alles sein darf und nur diese Klasse, welche das „übersetzt“ muss eine Liste mit Elementen vom Typ T akzeptieren. Aber beim ersten Fall verzweifle ich gerade, weil ich kann im Konstruktor nicht sagen, dass die Liste vom Typ T und vom Typ „Interface welche den Text zurück gibt“ sein muss.
So sieht aktuell die Implementierung aus:
Java:
public class Liste<T> {
private final A<T> namer;
public static interface NamedListItem {
String getItemName();
}
public static final ListItemNamer<Object> TO_STRING_NAMER = new ListItemNamer<Object>() {
@Override
public String getItemName(Object t) {
return t == null ? "null" : t.toString();
}
};
public static interface ListItemNamer<T> {
String getItemName(T t);
}
public static interface A<T> {
T getItem(int i);
String getItemText(int i);
}
public static final class NamedListNamer<X extends NamedListItem> implements A<X> {
private final List<X> namedItemlist;
public NamedListNamer(final List<X> namedItemlist) {
this.namedItemlist = namedItemlist;
}
public X getItem(int i) {
return this.namedItemlist.get(i);
}
@Override
public String getItemText(int i) {
return this.getItem(i).getItemName();
}
}
public static final class ListNamer<T> implements A<T> {
private final List<? extends T> list;
private final ListItemNamer<? super T> namer;
public ListNamer(final List<? extends T> list, final ListItemNamer<? super T> namer) {
this.list = list;
this.namer = namer;
}
@Override
public T getItem(int i) {
return this.list.get(i);
}
@Override
public String getItemText(int i) {
return this.namer.getItemName(this.getItem(i));
}
}
public String getItemText(int index) {
return this.namer.getItemText(index);
}
public T getItem(int index) {
return this.namer.getItem(index);
}
public <L extends T & NamedListItem> Liste(final List<L> list) {
this.namer = new NamedListNamer<T>(list);
}
public Liste(final List<? extends T> list, ListItemNamer<? super T> namer) {
this.namer = new ListNamer<T>(list, namer);
}
}
Der Fehler lautet:
Code:
Cannot specify any additional bound Liste.NamedListItem when first bound is a type parameter
Vielleicht hat jemand eine bessere Idee das umzusetzen, nur möchte ich nicht „Object.toString()“ nutzen um den Text für jeden Eintrag zurückzugeben. Und die Namen für die Klassen/Schnittstellen sind auch noch nicht endgültig, aber erstmal will ich das Problem los werden.
Fabian