2017-02-18 5 views
3

Ich entschuldige mich im Voraus, ich bin mir sicher, dass dies schon einmal gefragt wurde, aber ich bin ein selbstlernender Programmierer, so kann ich nicht für das Leben von mir die Begriffe I muss gesucht werden.Erhalten Sie den generischen Typ eines generischen Typs

Ich habe eine generische Klasse:

public abstract class Directory<T extends Key> 

Es ist ein allgemeiner Parameter einer anderen Klasse:

public class TagDescriptor<T extends Directory, U extends Key> 

Die U von TagDescriptor wird der generische Parameter des als erste übergeben Directory immer Parameter. Es ist in Ordnung, die T zu bestehen, aber gibt es keine Möglichkeit, die U abzuleiten? Ich habe versucht, Dinge wie:

public class TagDescriptor<T extends Directory<U>> 

Aber das ist falsch. Zur Kompilierzeit sollte es wissen, dass Directory eine generische hat; kann ich das nutzen?

+5

'public class TagDescriptor erweitert U-Taste>'. [Arbeitet hier] (http://ideone.com/8r4pHJ). –

Antwort

1

Sie können mehrere Typen deklarieren Parameter mit Selbstreferenz begrenzt:

public class TagDescriptor<K extends Key, T extends Directory<K>> 

NB: K häufig used, as a name, for key types ist.

Warum ist es erforderlich, den Typ Parameter K zu deklarieren? Nun, es ist ziemlich einfach: weil sonst der Compiler keine Möglichkeit hat zu sagen, was K ist: eine konkrete Klasse, eine Schnittstelle namens K? Oder ein Typparameter namens K?

Zum Beispiel wäre dies vollkommen legal sein:

public interface K {} 

public class TagDescriptor<T extends Directory<K>> 
+0

Ja, aber das ist überflüssig, meine Frage, wenn es nicht klar war: "Warum ist' Verzeichnis 'für sich nicht ausreichend", 'K' ist in diesem Fall definiert in' Verzeichnis ' – Anthony

+0

Oh, es ist nur Ausführlichkeit, um sicherzustellen, dass es keine Namenskollision gibt. Ich habe nicht einmal über einzelne Zeichenklassen/Schnittstellen nachgedacht. Vielen Dank. – Anthony

Verwandte Themen