2011-09-02 12 views
8

ho paio di pensieri per quanto riguarda il seguente:La sintassi <T si estende Class <T>> in Java

public interface MaxStack<T extends Comparable <T>> 

1-Perché la classe che implementa MaxStack deve essere scritto in questo modo:

public class MaxStackclass<T extends Comparable <T>> implements MaxStack<T> 

e non public class MaxStackclass<T extends Comparable <T>> implements MaxStack<T extends Comparable <T>>?

2- perché le variabili private di questa classe, quando uso i generici, devono essere scritte solo con <T> e non con <T extnds Comparable<T>>? Ad esempio, private List<T> stack= new ArrayList<T>();

3-Qual è la differenza tra <T extends Comparable<T>> e <T extends Comparable> - se ho bisogno di confrontare bewteen elementi della mia classe, entrambi saranno O.K, no?

Edit: Penso che il problema con 3 sia che forse permette di inserire una lista che è stata definita nel secondo modo di avere elementi diversi che tutti si estendono da comparabili e poi quando voglio confrontarli, ha vinto essere possibile, dal momento che non possiamo confrontare String a Integer, entrambi si estendono da Comparable.

+0

Solo un nitpick sullo stile: il nome della classe pubblica non è CamelCase, una convenzione che consente di evitare malintesi. Anche se non è un problema con le classi annidate, in questo caso è una classe pubblica ... –

+0

Grazie a @Tassos. – Numerator

+0

per risultati ottimali usare '>' – newacct

risposta

8
  1. Nella dichiarazione maxStackclass<T extends Comparable <T>> voi hanno già espresso i limiti sulla T. Quindi non ne hai più bisogno.

  2. Ragione come sopra. Non è necessario specificare nuovamente i limiti sullo stesso parametro di tipo.

  3. <T extends Comparable<T>> significa che T deve implementare l'interfaccia Comparable che può confrontare due T istanze. Mentre <T extends Comparable> significa T strumenti Comparable tali da poter confrontare due Object s in generale. Il primo è più specifico.

se ho bisogno di confrontare bewteen elementi della mia classe, entrambi saranno O.K, no?

Beh, tecnicamente si può ottenere lo stesso risultato utilizzando sia. Ma per la dichiarazione <T extends Comparable> coinvolgerà calchi inutili che si può evitare di utilizzare al sicuro il tipo <T extends Comparable<T>>

2

1) la classe ha un parametro di tipo T con un balzo (extends Comparable <T>), questo parametro viene passato all'interfaccia (che ha bisogno del lo stesso limite qui). Quando si passa un parametro di tipo, non si deve ripetere il suo limite - perché si dovrebbe fare così?

2) come 1), il parametro tipo ha il suo limite dichiarato, nessuna ripetizione necessaria.

per chiarire:

La prima occorrenza parametro type (qui dietro il nome dell'interfaccia o classe) è la sua dichiarazione. Qualsiasi evento successivo è un utilizzo. Non scriverebbe mai mai una dichiarazione di tipo di variabile ogni volta che la usi, giusto?

2

"3-Qual è la differenza tra <T extends Comparable<T>> e <T extends Comparable> - se ho bisogno di confrontare quindici elementi nella mia classe, entrambi saranno O.K, no?"

No, entrambi non andranno bene. Supponiamo che io abbia una classe Foo quale implements Comparable<Bar> ma le classi Foo e Bar non hanno alcuna relazione l'una con l'altra. Quindi Foo non può essere paragonato ad altri oggetti di tipo . <T extends Comparable<T>> prenderà questo come un problema. <T extends Comparable> no.

0
<T extends Comparable<? super T>> 
più

dettagli here

Problemi correlati