2016-04-01 4 views
2

Ich lerne derzeit Generika und habe es schwer, einige Aspekte von ihnen zu verstehen. Ich habe das Gefühl, etwas übersehen zu haben, daher klingt die Frage vielleicht dumm.Geben Sie Argumente in Sub-Klasse-Deklarationen ein

Ich verstehe, dass es:

  1. Platzhalter, bekannt als 'formalen Parameter des Typs'.
  2. Tatsächliche 'Typ Argumente'.

Hier ist ein Stück Beispielcode I mit Generika und Verfahren Verkettungs haben, das funktioniert:

class Clothing <T> { 
    String material; 
    String color; 

    T setMaterial (String material) { 
     this.material = material; 
     return (T) this; 
    } 

    T setColor (String color) { 
     this.color = color; 
     return (T) this; 
    } 

} 

class Jeans extends Clothing <Jeans> { 

} 

class Pants extends Clothing <Pants> { 

} 


class Executor { 

    public static void main(String[] args){ 
     Jeans jeansPair = new Jeans().setMaterial("cotton").setColor("green"); 
    } 

} 

Das Problem, das ich nicht verstehe, ist, warum der Typ arugment wie Jeans und Hosen werden in Unterklassen-Deklarationen anstelle von Instanziierungen wie die in der Hauptmethode bereitgestellt.

Ich würde mich freuen, wenn Sie einen Link zu dieser Regel - ich habe eine Menge Informationen wie beschränkte Parameter, rohe Typen, löschen etc. aber nicht ganz gefunden, was ich gesucht habe.

Dank

+1

Dies ist kurios wiederkehrendes generisches Muster oder Template-Muster in C++ https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – flakes

+1

Sie können diesen Beitrag auch http: // stackoverflow betrachten.com/q/26762955/3280538 – flakes

+1

Dies ist auch eine Möglichkeit zu ermöglichen, eine abstrakte Basisklasse Methodenverkettung durchführen http://www.unquietcode.com/blog/2011/programming/using-generics-to-build-fluent-apis -in-java/ – flakes

Antwort

0

Abgesehen: Sie würden wahrscheinlich haben eine einfachere Zeit mit diesem Generika, wenn Sie ein Builder-Muster verwendet, anstatt die veränderbaren Muster, das Sie hier beschreiben sind. Ich habe nur answered a related question, die ein Beispiel für eine solche Builder-Struktur bietet.

Jeans und Pants sind konkrete Typen ohne generische Parameter, weshalb ist, wenn sie den Bau sagen Sie einfach new Jeans()/new Pants(); Sie haben keinen generischen Typ, den der Anrufer angeben kann. Da sie auch eine generische Art erweitern, könnte man sagen:

Clothing<Jeans> jeans = new Jeans()....; 

, wenn Sie auf das Objekt durch seinen generischen Elterntyp beziehen wollen. Dies unterscheidet sich nicht von anderen Beziehungen zwischen Vater und Kind, z. B. List<String> vs. ArrayList<String>. Diese Klassen codieren einfach den Wert des generischen Typs.

Man könnte sich vorstellen, die Methoden in Clothing in Jeans und Pants Kopieren und T mit Jeans und Pants jeweils zu ersetzen, wenn das hilft Sie sehen das, was diese Klassen tun.

Wie warum das Argument Typ in Sub-Klasse-Deklarationen zur Verfügung gestellt wird, ist es eine stilistische Wahl, gibt es keine Regel darüber, wann es verwendet werden sollte. Es ist schön, wenn Sie eine endliche Anzahl von Typen haben, die als generischer Typ verwendet werden können/sollten, da Anrufer nicht jedes Mal den Typ explizit angeben müssen. Im "generischen" Fall jedoch, in dem ein generischer Typ eine beliebige Anzahl verschiedener konkreter Typen darstellt, ist dieses Muster nachteilig, da der Klassenautor für jeden gegebenen Typ eine neue Unterklasse definieren muss.

Verwandte Themen