L'utilizzo di un'interfaccia come Comparable
come parametro del metodo non rende generica la classe, dichiarando e utilizzando parametri di tipo generico è come la si rende generica. risposta
Quick-n-sporco: Stai ricevendo l'avviso perché si sta utilizzando Comparable
, che è un'interfaccia generica, come un tipo grezzo, piuttosto che dando uno specifico argomenti di tipo, come Comparable<String>
.
Per risolvere questo problema, fanno add()
generico specificando parametri di tipo:
<T extends Comparable<? super T>> add(T obj) { ... }
Ma questa soluzione rapida non risolve il problema generale che la classe è a rischio. Dopotutto, non tutti gli oggetti del tuo elenco dovrebbero essere dello stesso tipo? Questo metodo add
consente di inserire tipi diversi nello stesso elenco. Che cosa accade quando si tenta di confrontare tipi eterogenei (come si fa a compareTo
un'istanza Object
a un'istanza Number
oa un'istanza di String)? Puoi fare affidamento sull'utente della classe per fare la cosa giusta e assicurarti che rimangano solo 1 tipo di cosa nella tua lista, ma una classe generica permetterà al compilatore di applicare questa regola.
L'approccio migliore: La corretta correzione è che la classe lista ordinata dovrebbe essere probabilmente essere generico globale, proprio come le altre classi di raccolta in java.util
.
si sarebbe probabilmente come qualcosa di simile:
public class SortedList<T extends Comparable<? super T>>
implements Iterable<T> {
...
public void add(T item) { ... }
public Iterator<T> iterator() { ... }
...
}
Si noti che quando la classe è generico, il metodo add
utilizza il parametro di tipo formale classi piuttosto che dichiarare il proprio parametro di tipo formale.
Ci dovrebbe essere un sacco di tutorial sul web su come creare una classe generica, ma ecco un esempio veloce:
http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ002
class Pair<X,Y> {
private X first;
private Y second;
public Pair(X a1, Y a2) {
first = a1;
second = a2;
}
public X getFirst() { return first; }
public Y getSecond() { return second; }
public void setFirst(X arg) { first = arg; }
public void setSecond(Y arg) { second = arg; }
}
Dovrebbe essere 'T estende Paragonabile super T>'. – ColinD
Beh, l'ho provato come era prima e ha funzionato. – 3mpty