2010-01-14 12 views
6

Ho appena imparato fino all'albero e una cosa che non capisco è la dichiarazione della classe:Cosa significa questa dichiarazione di classe in Java?

ad esempio: classe BinarySearchTree<T extends Comparable<? super T>>.

Ora, puoi spiegarmi cosa c'è nella staffa e "<? super T>"?

Qualunque buona fonte puoi farmi riferimento? Grazie.

risposta

15

Questo dichiara una classe con un unico parametro di tipo generico. Poiché per l'albero di ricerca binario è imperativo che possa confrontare due elementi, è necessario specificarlo in modo che il compilatore possa verificarlo.

La parte tra parentesi angolari è il parametro di tipo T e un vincolo per esso che dice:

  • Qualunque sia T è, dovrebbe estendere Comparable (<T extends Comparable<...>>).
  • Detto Comparable dovrebbe essere in grado di confrontare se stesso a T o una super-classe di T (<? super T>).

Poiché T di solito può essere qualsiasi cosa ciò limita la scelta di tipi in cui ha senso implementare un albero di ricerca per.

0

Sun's Tutorial è un buon punto di partenza per l'apprendimento di caratteri jolly e generici.

Java Ranch è anche molto buono per Java "Greenhorns".

1

Le parentesi "<" sono per i cosiddetti generici. Questo è molto simile a un modello in C++ e consente di creare una singola struttura dati che può essere fortemente tipizzata. Ad esempio, l'oggetto ArrayList utilizza un generico per definire il tipo di articoli sono in all'ArrayList:

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

Quando si definisce una struttura che fa uso di farmaci generici utilizzati per notazione sopra. La "T" è un segnaposto per una classe che viene compilata quando la classe viene creata un'istanza e data un tipo. Ad esempio, la definizione di ArrayList potrebbe apparire qualcosa di simile:

public class ArrayList<T> ... 

Il modo più semplice è quello di utilizzare semplicemente MyGeneric<T> e lasciare che essere utilizzato qualsiasi classe. Tuttavia, a volte si desidera utilizzare Gereric solo con le classi in una determinata struttura di ereditarietà. In questo caso specifico Comparable<? super T> significa che questo sarà un oggetto che estende Paragonabile a Confronta qualsiasi tipo di oggetto che corrisponde a T o è una super-classe di T.

+0

Questo è anche un utile asnwer grazie – gingergeek

0

La frase <? super T> è un jolly e implica che, di classe BinarySearchTree può prendere:
a. un parametro di tipo (T) che si estende Comparabile
b. ed anche può prendere un sottotipo (S) il cui genitore estende comparable

Il costrutto <? super T> estende utilità di classe BinarySearchTree a tipo (s) che implementa Comparable ei suoi sottotipi.

seguito frammento di codice dimostra questo:

// 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 
} 

Con la dichiarazione dichiarazione Helper<Animal> x = new Helper<Animal>() funziona bene sopra.
Ma la dichiarazione: Helper<Mammal> x = new Helper<Mammal>() dà l'errore di compilazione
parametro type Mammifero non è nel suo legato
(la versione del compilatore è javac 1.5.0_06)

Se la dichiarazione della classe di supporto viene modificato in seguito modulo:

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

quindi la dichiarazione Helper<Mammal> x = new Helper<Mammal>() non fornisce alcun errore del compilatore.

Quindi l'utilizzo del carattere jolly massimizza l'utilità della classe.

Problemi correlati