Sto provando a scrivere una classe che ha una variabile membro generica ma che non è, di per sé, generica. Nello specifico, voglio dire che ho una lista di valori di "qualche tipo che implementa paragonabile a se stessa", in modo che io possa chiamare sort in quella lista ... Spero che abbia senso.Variabile di istanza generica nella classe non generica
Il risultato finale di ciò che sto tentando di fare è creare una classe tale che sia possibile creare un'istanza di detta classe con una matrice di (qualsiasi tipo specificato) e generare una rappresentazione di stringa per tale elenco. Nel codice vero e proprio, passo anche nella classe dei tipi che sto passando in:
String s = new MyClass(Integer.class, 1,2,3).asString();
assertEquals("1 or 2 or 3", s);
String s = new MyClass(String.class, "c", "b", "a").asString();
assertEquals("\"a\" or \"b\" or \"c\"", s);
Originariamente non ho nemmeno voglia di passare nella classe, volevo solo passare i valori e hanno il codice esamina la matrice risultante per scegliere la classe dei valori ... ma mi stava dando dei problemi.
Quanto segue è il codice che ho, ma non riesco a trovare il mojo corretto da inserire per il tipo di variabile.
public class MyClass {
// This doesn't work as T isn't defined
final List<T extends Comparable<? super T>> values;
public <T extends Comparable<? super T>> MyClass (T... values) {
this.values = new ArrayList<T>();
for(T item : values) {
this.values.add(item);
}
}
public <T extends Comparable<? super T>> List<T> getSortedLst() {
Collections.sort(this.values);
return this.values;
}
}
errore sulla linea di dichiarazione variabili:
Syntax error on token "extends", , expected
Qualsiasi aiuto sarebbe molto apprezzato.
Modifica: codice aggiornato da utilizzare Elenco anziché matrice, perché non sono sicuro che possa essere eseguito con gli array.
@ Marco: Da tutto quello che ho letto, ci tengo a dire "T è un tipo che è paragonabile a se stesso", non solo "T è un tipo che è paragonabile". Detto questo, il seguente codice non funziona neanche:
errorepublic class MyClass {
// This doesn't work
final List<? extends Comparable> values;
public <T extends Comparable> MyClass (T... values) {
this.values = new ArrayList<T>();
for(T item : values) {
this.values.add(item);
}
}
public <T extends Comparable> List<T> getSortedLst() {
Collections.sort(this.values);
return this.values;
}
}
on line aggiungere:
The method add(capture#2-of ? extends Comparable) in the type List<capture#2-of ? extends Comparable> is not applicable for the arguments (T)
errore sulla linea sorta:
Type mismatch: cannot convert from List<capture#4-of ? extends Comparable> to List<T>
Conclusione:
A quanto pare, Java non è in grado di gestire a voglio fare. Il problema è che quello che sto cercando di dire è:
Voglio un elenco di elementi che sono paragonabili contro se stessi, e io creare la lista in una sola volta dai dati passati in fase di creazione.
Tuttavia, Java vede che ho quella lista e non riesco a inchiodare giù che tutte le informazioni per la mia situazione è disponibile al momento della compilazione, da quando ho potuto provare ad aggiungere cose alla lista più tardi e, a causa di digitare cancellazione, non può garantire che la sicurezza. Non è davvero possibile comunicare a Java le condizioni coinvolte nella mia situazione senza applicare il tipo generico alla classe.
Perché non è sufficiente avere un elenco di cose che implementano Comparable? –
Non che risolva il problema, ma qualcosa che è paragonabile non significa che sia paragonabile a se stesso. Solo l'implementazione di Comparable non dice "è paragonabile a se stesso". – RHSeeger
Puoi farlo con metodi statici. Vedi la mia seconda risposta. – TofuBeer