2011-02-01 13 views
9

Ho un sacco di classi in Java che implementano tutte un'interfaccia chiamata IdObject (che specifica un metodo getId()). Inoltre, tutti implementano anche Comparable <> con se stessi come parametro type, quindi sono tutti paragonabili a se stessi.Java: dichiarazione di variabili con più "vincoli" generici su di esse

Quello che mi piacerebbe fare è dichiarare un elenco di tali oggetti, compilarlo, quindi ordinarlo e chiamare getId() su di essi. Quindi il mio codice è simile al seguente:

List<? extends IdObject & Comparable<?>> objectList = null; 

if (foo) { 
    objectList = new ArrayList<TypeA>(); 
    ... 
} else if (bar) { 
    objectList = new ArrayList<TypeB>(); 
    ... 
} 

if (objectList != null) { 
    Collections.sort(objectList); 
    for (IdObject o : objectList) { 
     System.out.println(o.getId()); 
    } 
} 

Fondamentalmente il mio problema si trova in prima linea - voglio specificare due "vincoli" per il tipo perché ho bisogno il primo a fare in modo che posso stampare l'ID in il ciclo e il secondo per essere sicuro di poter usare Collections.sort() sulla lista.

La prima riga non viene compilata.

C'è un modo per farlo funzionare senza specificare un tipo generico senza parametri di tipo e utilizzando operazioni non controllate? Non ho potuto trovare un esempio di questo su Internet.

Saluti

risposta

0

ne dite di creare antoher tipo;

public CompIdObject extends IdObject implements Comparable { 
... 
} 

e utilizzare questo tipo per i generici?

List<? extends CompIdObject<?>> objectList = null; 
+2

Avviso: CompIdObject non è dichiarato come generico. – Nicolas

11
List<? extends IdObject & Comparable<?>> 

Questo tipo di multiple bounded type parameters è possibile solo nelle firme di classe, ho paura.

quindi credo che il più vicino si può arrivare è quello di definire un'interfaccia:

public interface MyInterface extends IdObject, Comparable<MyInterface> 

E dichiarare il vostro elenco come questo:

List<? extends MyInterface> objectList = null; 
+1

Meglio dire "ComparableIdObject" di "MyInterface". – Raedwald

+0

@ Raedwald ovviamente, sì. –

+1

Ti aspetti davvero che ogni classe che implementa 'MyInterface' sia paragonabile a tutte le altre? In caso contrario, prova l'interfaccia pubblica MyInterface estende IdObject, Comparable > 'e' List > objectList' – finnw

0

ho voluto fare cose simili prima su campi pure, ma non può essere fatto (forse qualcuno potrebbe approfondire se questa è una restrizione tecnica o una scelta progettuale, non sono sicuro).

La via da seguire sarebbe progettare un inter volto che estende IdObject e Comparable, quindi lo usa nella definizione di elenco generico.

Problemi correlati