2011-12-16 14 views
24

Il contesto completo benessere:Java- Il significato di <T si estende Comparable <T>>?

public class RClass<T extends Comparable<T>> 

Sarei ragione nel dire che la dichiarazione nel titolo significa che gli argomenti collegati metodo devono essere sia un oggetto di una classe che implementa comparabili o uno dei suoi derivati classi?

Grazie.

+8

Nota, '>' (penso che si possa fare lì), sarebbe preferibile, in quanto si potrebbe desiderare che 'T' sia più preciso dell'implementazione di' Comparable'. –

+1

@ TomHawtin-tackline Puoi dare un esempio del perché questo sia necessario? Supponiamo che io abbia la mia struttura dati Elenco che funziona solo con tipi comparabili. Il modo in cui vorrei specificarlo è MyList di classe pubblica >. Penso che affermerei e imporre che la mia struttura dati funzioni solo con tipi comparabili, in che modo il tuo fraseggio può fare la differenza? – committedandroider

risposta

27

Ciò significa che il parametro type deve supportare il confronto con altre istanze del proprio tipo, tramite l'interfaccia Comparable.

Un esempio di tale classe è fornito nel tutorial Oracle Object Ordering. Si noti il ​​modello simile a T extends Comparable<T> nel brano qui sotto:

public class Name implements Comparable<Name> { 
    ... 
    public int compareTo(Name n) { ... } 
} 
+4

Perché non basta avere gli utensili Nome comparabili? Perché è necessario specificare nuovamente il nome della classe? – committedandroider

+5

@committedandroider perché Comparable è un'interfaccia generica è necessario specificare il tipo – bitek

2

Sì, e tenere a mente che gli oggetti delle classi derivate da ComparableSONOComparable oggetti. L'ereditarietà è una relazione is-a.

2

Ciò significa che è possibile creare solo un'istanza di RClass con un tipo che si estende letteralmente Comparable<T>. Così,

RClass<Integer> a; 

è accettabile, poiché Integer estende Comparable<Integer>, mentre

RClass<Object> b; 

non è, poiché Object non è una classe che estende paragonabile affatto.

3

Da qualche parte in quella classe, il programmatore ha bisogno di scrivere qualcosa di simile

if(t.compareTo(othert) < 0) { 
    ... 
} 

Per funzionare, il tipo T deve avere un compareTo-metodo che lo paragona ad un altro oggetto di tipo T. estensione delle garanzie comparabili l'esistenza di un tale metodo, tra le altre cose.

6

Java- Il significato di<T extends Comparable<T>>?

a) Comparable <T> è un'interfaccia generica (ricordatevi che è una "interfaccia" cioè non una "classe")

b) extends significa eredità da una classe o un'interfaccia.

Dal suddetto punto # A, è un'interfaccia .. (Ricordate che è un'eredità da una "interfaccia", cioè non da un "classe")

c) Da sopra-detto che sia i punti # a & #b,

qui "un'interfaccia" estende "un'altra interfaccia".

Ci dovrebbe essere un'interfaccia definita per questa classe .. solo un esempio qui è

interface MinMax<T extends Comparable<T>> { 
    T min(); 
    T max(); 
} 

d) ora la classe cioè public class RClass {} DOVREBBE

1 # SIA "attuare" questa "interfaccia generica" ​​Comparable<T> .. !!!

es: public class RClass<T> implements Comparable<T>

2 # o creare un'interfaccia ed estendere a questa "interfaccia generica" ​​Comparable<T> es:

interface MinMax<T extends Comparable<T>> { 
    T min(); 
    T max(); 
} 
class RClass<T extends Comparable<T>> implements MinMax<T> { 
    ..... 
    ..... 
} 

Qui, prestare particolare attenzione al modo in cui il parametro di tipo T è dichiarato da RClass e quindi passato a MinMax. Perché MinMax richiede un tipo che implementa Comparable, la classe di implementazione (RClass in questo caso) deve specificare lo stesso limite. Inoltre, una volta stabilito questo limite, non è necessario specificarlo nuovamente nella clausola implements.

+1

Nella domanda, è stato chiesto che 'public ** class ** RClass >'. È una classe e non un'interfaccia. Quindi, per favore, commenta quale sarà il significato se si tratta di una classe. –

1

In poche parole, il tipo generico T deve essere comparabile per poter confrontare. altrimenti non puoi fare T.compareTo. Nel punto 28 java efficace, esso suggerisce: "always use Comparable<? super T> in preference to Comparable<T>. <T extends Comparable<? super T>>"

0

==> guhanvj, <T extends Comparable<T>> significa che sta avendo <T> limite superiore Comparable<T> oggetti. Pertanto, <T> può avere tipi di classi Byte, Character, Double, Float, Long, Short, String e Integer che implementano tutte l'interfaccia Comparable<T> per l'ordinamento naturale.

Problemi correlati