Generic muss zwei Klassen/Interfaces erfüllen

xZise

Aktives Mitglied
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:

  1. Die Einträge der Liste implementieren ein bestimmtes Interface (T extends Interface)
  2. 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
 
N

nillehammer

Gast
Ich würde das ähnlich machen, wie bei den sortierten Collections. Denen kann man eine Instanz eines Comparator-Interfaces bei der Instanzierung mitgeben. An diese wird der Vergleich dann delegiert. Mit der Ausgabe einer Stringrepräsentation könntest Du es genauso machen.

Definiere ein Interface ItemRenderer, welches, die Ausgabe der Stringrepräsentation der Instanz einer best. Klasse übernimmt. Übergebe dieses als Konstruktorparameter an Deine Liste. Code wäre ungefähr so:

Java:
public interface ItemRenderer<T> {
  public String render(final T objToRender);
}

public Liste<T> {

  private final ItemRenderer<T> itemRenderer;

  public Liste(final ItemRenderer<T> itemRenderer) {

    this.itemRenderer = itemRenderer;
  }
}
Über die konkreten Implementierungen kannst du dann steuern, was genau ausgegeben wird. Ein PersonRenderer könnte bspw. Vorname Nachname ausgeben.
 

faetzminator

Gesperrter Benutzer
Der Fehler lautet:
Code:
Cannot specify any additional bound Liste.NamedListItem when first bound is a type parameter

Soviel mir ist, sind nur Interfaces zugelassen. Also weder Klassen noch irgendwelche unklaren Types. D.h. es gibt eigentlich nur zwei Möglichkeiten. Entweder ist T bereits extends XY, oder aber du erstellst eine Kindklasse derer, die dann eben ein T extends XY erwartet.
Edit: Gerade getestet: Es kann auch eine Klasse und Interface(s) sein, wenn man die Klasse als erstes angibt.
 

andiv

Bekanntes Mitglied
Der Hinweis auf Comparator ist gut, noch besser wird er wenn du dir gleich noch Comparable dazu anschaust. Pseudocode:

Java:
interface Comparable<T> {
    int compareTo(T obj);
}

interface Comparator<T> {
    int compare(T obj1, T obj2);
}

class Collections {
    static <T extends Comparable<T>> void sort(List<T> list) {...}
    static <T> void sort(List<T> list, Comparator<T> comp) {...}
}

Die sort-Methode ohne Comparator kann dann auf die andere sort-Methode zurückgreifen indem einfach ein Comparator erstellt wird der die compareTo-Methode der T-Objekte verwendet.

Dieses Vorgehensschema sollte sich eigentlich ohne weiteres auf deinen Anwendungsfall übertragen lassen.
 

andiv

Bekanntes Mitglied
Also ich stell mir das so in der Art vor, printList ohne Printer kann dann wieder auf die andere Methode zurückgreifen indem ein Printer erstellt wird der die print-Methode der Printable-Objekte aufruft.

Java:
interface Printable {
    String print();
}

interface Printer<T> {
    String print(T obj);
}

class Utility {
    <T extends Printable> String printList(List<T> list) {...}
    <T> String printList(List<T> list, Printer<T> printer) {...}
}
 

xZise

Aktives Mitglied
Genau an dieses [c]Comparable[/c] und [c]Comparator[/c] gespann habe ich auch gedacht. Es gibt ja [c]NamedListItem[/c] und [c]ListItemNamer[/c] welche genau das übernehmen. Jetzt wollte ich eine Liste darum packen, wo man entweder eine Liste mit NamedListItem übergibt, oder halt eine einfache Liste und dann mit dem ListItemNamer welcher dann das übernimmt.

Aber wenn ich die Liste mit NamedListItems haben will, dann muss diese ja auch von T erben. Und das kann ich nicht machen: Entweder meckert er rum, dass die Liste nicht unbedingt NamedListItems enthält oder das die Liste nicht unbedingt elemente von T enthält.

Und mir ist schleierhaft, wieso [c]<L extends T & NamedListItem>[/c] nicht geht. Den [c]NamedListItem[/c] ist ja ein Interface.

Fabian
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
Rakshan Generic reading of XML document from the root tag into an Collection Allgemeine Java-Themen 0
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
Neumi5694 Datentypen Generic mit parameterlosem Konstructor Allgemeine Java-Themen 4
C Generic collections und static typing Allgemeine Java-Themen 4
K Generic class und Reflection Allgemeine Java-Themen 2
K Saubere Verwendung von Generic Types Allgemeine Java-Themen 7
T Generic Allgemeine Java-Themen 1
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
M Cannot create a generic array of T Allgemeine Java-Themen 5
N Generic extends Generic Allgemeine Java-Themen 5
TheWhiteShadow Generic Bug? Allgemeine Java-Themen 19
P Generic zur Laufzeit Allgemeine Java-Themen 4
S Reflection und Generic Allgemeine Java-Themen 9
G Klasse eines Generic Allgemeine Java-Themen 6
J Generic von einer ArrayList/HashMap bekommen Allgemeine Java-Themen 7
G Generic merhfach Angabe Allgemeine Java-Themen 8
Dragonfire Generic Typ zur Laufzeit Allgemeine Java-Themen 9
N Casten durch generic vermeiden ?? Allgemeine Java-Themen 10
N generic reflection Allgemeine Java-Themen 5
thE_29 Generic Methoden die sich aufrufen wollen nicht immer Allgemeine Java-Themen 12
A Generic-Problem. was meint ihr dazu? Allgemeine Java-Themen 4
G unbekanntes Generic Allgemeine Java-Themen 12
K Bound mismatch: The generic method sort(List<T>) of ty Allgemeine Java-Themen 4
V ArrayList ist nicht generic!?? Oder bin ich blöd? Allgemeine Java-Themen 2
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
C Generic Type ermitteln Allgemeine Java-Themen 3
H References to generic type Test.A<typ> should be param Allgemeine Java-Themen 5
byte Generic Type einer List zur Laufzeit rausfinden? Allgemeine Java-Themen 4
berserkerdq2 SceneBuilder GUI erstellt, nun muss ich noch ein Polygon erstellen, ist die Connection möglich? Allgemeine Java-Themen 3
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
M wiviel Java muss ich für die Berufswelt können ? Allgemeine Java-Themen 5
Zrebna Wieviele Testfälle muss man hier schreiben? (Software Engineering) Allgemeine Java-Themen 13
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
R Was muss ich ändern, damit der Kreis links unten gezeichnet wird? Allgemeine Java-Themen 17
Drachenbauer Wie muss ein Konstructor aussehen, um dinge mit verschiedenen Zusätzen in den "<>" anzunehmen? Allgemeine Java-Themen 1
S Validation Null aber nicht Blank und muss Email sein Allgemeine Java-Themen 22
W Warum muss void main() public sein? Allgemeine Java-Themen 3
T Was muss ich zu JSMPP bzw anderen Lösungen wissen? Allgemeine Java-Themen 0
Neumi5694 Vererbung Parameter muss 2 Bedingungen erfüllen Allgemeine Java-Themen 2
K Muss ich Eclipse und Java nochmal neu installieren? Allgemeine Java-Themen 10
E Compiler-Fehler wie muss ich die entstandene Quellcode kompilieren?? Allgemeine Java-Themen 2
P Mail wird nicht gesendet - Muss ich kein PW angeben ? Allgemeine Java-Themen 13
D Muss eine JNI Biblio testen (MAC OS X) Allgemeine Java-Themen 4
X Will JAR Datei zum Download anbieten, worauf muss ich rechtlich achten? Allgemeine Java-Themen 2
J Applet in JAR packen - was muss in main() stehen? Allgemeine Java-Themen 12
B welchen port muss ich angeben? Allgemeine Java-Themen 11
J Erstes Programm bei Sourceforge: Was muss ich beachten? Allgemeine Java-Themen 18
C JAVA Anwendung - Was muss auf dem Server installiert sein? Allgemeine Java-Themen 6
G Threads werden nicht beendet. Was muss dahin? Allgemeine Java-Themen 12
G wer muss hier wen aufrufen? Allgemeine Java-Themen 7
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
D Zwei Listen vergleichen Allgemeine Java-Themen 7
Tobero Wie berechnet man ob zwei Linien sich schneiden? Allgemeine Java-Themen 2
kodela Zwei gleichzeitig gedrückte Steuertasten Allgemeine Java-Themen 10
X Bedingung zwei mal überprüfen Allgemeine Java-Themen 4
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
K Aus String zwei Jahreszahlen auslesen Allgemeine Java-Themen 18
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
VfL_Freak Double mit zwei festen NK-Stellen ausgeben Allgemeine Java-Themen 9
Neoline Methoden Zwei Arrays abwechselnd zusammenführen Allgemeine Java-Themen 15
J Zwei Wavdateien gleichzeitig mit SourceDataLine abspielen Allgemeine Java-Themen 0
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
J Fahrroute zwischen zwei Punkten finden Allgemeine Java-Themen 1
J Kollision von zwei Kreisen Allgemeine Java-Themen 15
J Transfer von Integer zwischen zwei Clients - RMI Allgemeine Java-Themen 4
S Variablen split-Funkton mit zwei Variabeln verwenden? Allgemeine Java-Themen 4
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
AssELAss Zwei Arrays / ArrayLists inhaltlich vergleichen Allgemeine Java-Themen 2
H RegularExpression zwischen zwei Strings Allgemeine Java-Themen 2
P Zwei Applikationen mit einem Job Allgemeine Java-Themen 0
A Lineare Interpolation mit zwei Arrays Allgemeine Java-Themen 4
E Berechnung des Schnittpunktes von zwei Geraden Allgemeine Java-Themen 1
S Zwei String vergleichen, Fehler markieren Allgemeine Java-Themen 3
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Dechasa Vergleichen von zwei Arrays Allgemeine Java-Themen 4
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
S Anwendung zum ausrechnen der Differenz von zwei Tagen Allgemeine Java-Themen 9
F Zwei LinkedHashMaps iterieren und vergleichen Allgemeine Java-Themen 2
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
L Zwei Files miteinander vergleichen und Grafisch darstellen Allgemeine Java-Themen 1
T Zwei Wortendungen vergleichen ohne .equals Allgemeine Java-Themen 10
F Webstart zwei Java Versionen / aktivieren bzw deaktivieren Allgemeine Java-Themen 2
S Zwei Comparable (compareTo) vergleichen Allgemeine Java-Themen 6
E zwei Gleitkommazahlen durcheinander dividieren Allgemeine Java-Themen 2
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
C Threads Zwei Threads greifen auf LinkedList zu. Allgemeine Java-Themen 12
T Wie heißt ein Binärbaum, dessen Knoten immer zwei Kinder haben müssen? Allgemeine Java-Themen 2
C ActionListener zwei Buttons zuweisen Allgemeine Java-Themen 11
M Eclipse drei slashs durch zwei ersetzen? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben