2010-01-14 12 views
6

po prostu nauczyć się na drzewo i jedno nie rozumiem o niej jest deklaracja klasy:Co oznacza ta deklaracja klasy w języku Java?

na przykład: klasa BinarySearchTree<T extends Comparable<? super T>>.

Teraz możesz mi wyjaśnić, co jest w nawiasie i "<? super T>"?

Jakieś dobre źródło, do którego możesz mnie polecić? Dzięki.

Odpowiedz

15

Ten deklaruje klasę za pomocą jednego parametru typu rodzajowego. Ponieważ dla drzewa wyszukiwania binarnego konieczne jest porównanie dwóch elementów, należy to określić, aby kompilator mógł je zweryfikować.

część w nawiasach kątowych jest parametrem typu T i ograniczenie do niego, który mówi:

  • Cokolwiek T jest, należy przedłużyć Comparable (<T extends Comparable<...>>).
  • Said Comparable powinien być w stanie porównać się z T lub superklasą T (<? super T>).

Od może być czymkolwiek, co ogranicza wybór typów, w których ma sens zaimplementowanie drzewa wyszukiwania.

0

Słońce Tutorial to dobre miejsce do rozpoczęcia nauki na temat symboli wieloznacznych i generycznych.

Java Ranch jest również bardzo dobre dla Java "Greenhorns".

1

Nawiasy klamrowe są dla tak zwanych generycznych. Jest to dużo jak szablon w C++ i pozwala utworzyć pojedynczą strukturę danych, którą można silnie wpisać. Na przykład, ArrayList obiekt używa rodzajowy do określenia, jakiego rodzaju rzeczy są w ArrayList:

ArrayList<String> - an ArrayList containing Strings 
ArrayList<MyClass> - an ArrayList containing MyClass objects 

Przy definiowaniu strukturę, która sprawia, że ​​stosowanie leków generycznych, których używasz do zapisu powyżej. "T" jest symbolem zastępczym dla niektórych klas, które są wypełniane, gdy klasa jest instancjonowana i otrzymuje typ. Na przykład, definicja ArrayList może wyglądać tak:

public class ArrayList<T> ... 

Najprostszym sposobem jest po prostu użyć MyGeneric<T> i niech każda klasa być użyte. Jednak czasami chcesz, aby gereric był używany z klasami w pewnej strukturze dziedziczenia. W tym konkretnym przypadku Comparable<? super T> oznacza, że ​​będzie to obiekt, który rozszerza się Porównywalnie porównuje dowolny typ obiektu, który pasuje do T lub jest super-klasy T.

+0

Jest to również pomocne asnwer dzięki – gingergeek

0

Wyrażenie <? super T> jest wieloznaczne i oznacza, że ​​klasa BinarySearchTree może trwać:
a. parametr typu (T), który rozszerza się Porównywalne
b., a także można podjąć podtypu (S), którego dominująca rozciąga Porównywalne

Konstrukt <? super T> rozszerza użyteczność klasy BinarySearchTree do typu (ów), który implementuje Porównywalne i podtypów.

Poniżej fragment kodu pokazuje to:

// Below declaration of Helper class doesn't uses the wildcard super 
class Helper<T extends Comparable<T>> { 
    // some helper methods 
} 

abstract class Animal implements Comparable<Animal> { 
    public int compareTo(final Animal o) { 
     // implementation ...   
    } 
    // other abstract methods 
} 

class Mammal extends Animal { 
    // implement abstract methods 
} 

z powyższym oświadczeniem rachunku Helper<Animal> x = new Helper<Animal>() działa dobrze.
Ale stwierdzenie: Helper<Mammal> x = new Helper<Mammal>() daje błąd kompilacji
parametru Typ ssakiem jest nie w jego związanego
(wersja kompilatora javac jest 1.5.0_06)

Gdy deklaracja Helper klasy zmienia się poniżej formularz:

class Helper<T extends Comparable<? super T>> { 
    // some helper methods 
} 

następnie oświadczenie Helper<Mammal> x = new Helper<Mammal>() nie daje żadnego błędu kompilatora.

Tym samym użycie symbolu wieloznacznego maksymalizuje użyteczność klasy.