2017-05-08 2 views
2

Wie schreibe ich die folgende Klassendeklaration korrekt in Java?Java - generischer Klassenparameter mit einem generischen Parameter

public class BinarySearchTree<T extends BinarySearchNode<E implements Comparable<E>>> implements Iterable<E> 

Grundsätzlich Ich versuche, eine BinarySearchTree jeder Klasse T zu schaffen, die BinarySearchNode eines vergleichbaren Datentyp E erbt (Und mein BinarySearchTree sollte auch Iterable sein).

Wie kann ich diese Klasse in Java ordnungsgemäß deklarieren? Danke!

+1

Warum nimmt diese Sache den * Nodetyp * anstelle des * Elementtyps * als Typparameter? – user2357112

+0

Weil ich möchte, dass Klassen, die BinarySearchTree erweitern, den BinarySearchNode durch eine andere Klasse ersetzen können, die es erweitert. Zum Beispiel - Ein AVLTree würde BinarySearchTree erweitern und einen AVLNode anstelle des BinarySearchNode verwenden – RazK

+0

Offensichtlich erwarte ich nicht, dass jemand mir die Klassenimplementierung gibt, Wenn Sie meine Frage sorgfältig lesen, würden Sie verstehen, dass ich nur suche die richtige Art, die Zeile zu schreiben, die ich oben gepostet habe. – RazK

Antwort

2
public class BinarySearchTree<T extends BinarySearchNode<E>, E extends Comparable<E>> implements Iterable<E> 

Die Typ-Parameter benötigen E getrennt vom Knotentyp definiert werden, auch wenn es redundante Suche endet: BinarySearchTree<BinarySearchNode<String>, String>. Java lässt Sie nicht direkt auf einen generischen Parameter eines generischen Typs zugreifen.

Beachten Sie auch, dass generische Parameter immer "erweitert" auch mit Schnittstellen verwenden.

0

Mit Generics in Java werden Sie nur extends verwenden. Also, im Wesentlichen Ihre Methode Dekoration würde:

public class BinarySearchTree<T extends BinarySearchNode<E extends Comparable<E>>> extends Iterable<T> 

Auch für jene Klassen, die eine Schnittstelle implementieren, Generika extends verwenden. Die einzige andere Syntax für Generika ist super, wenn Sie die Vererbung aus der entgegengesetzten Richtung betrachten

+2

Dies wird nicht kompiliert. Sie können die Extends von Generics nicht in eine Klassendefinition verschachteln, d. H. Sie können nicht die Klasse A > 'haben. Außerdem ist 'Iterable' eine Schnittstelle, daher müssen Sie das Schlüsselwort' implements' verwenden, wenn die Klasse es tatsächlich implementiert, es kann nicht erweitert werden. –

Verwandte Themen