2009-09-22 6 views
10

Supponiamo che io ho una classe che implementa un'interfaccia:lista di oggetti java che tutto implementare un'interfaccia

public class A implements IB 

e ho un List<A> che vorrei fare riferimento a: List<? implements IB> list. In modo che posso codice: for (IB item : list) ecc.

Può essere fatto in qualche modo in Java? Non esiste la possibilità <? implements ...>. Cosa mi manca?

+1

Intendi IA? quando dici IB? – OscarRyz

risposta

3

Se si intende quella classe A IA implementa, piuttosto che IB, allora il vostro codice dovrebbe essere più che bene dire

for (A item : list) { 
    // handle item as if it is an IA 
} 

dal momento che tutti come sono, per definizione IA.

Nel frattempo, non è disponibile alcun jolly per <? implements C>. C'è <? extends C> e C può essere un'interfaccia o una classe; tuttavia, questo non è necessario per quello che sembra che tu stia cercando di fare.

Se si vuole esplicitamente dire for (IA item : list) perché non si sta garantendo che gli elementi in tale elenco sono A s, ma sta garantendo che essi sono IA s, allora penso che tu abbia un piccolo problema (non posso dire per certo, dal momento che non hai detto dove si trova questo codice di elaborazione dell'elenco). A List<A> è non a List<IA> per definizione; se stai creando un List<A> e poi lo passi a un metodo che si aspetta un List<IA>, riceverai un errore in fase di compilazione. Tuttavia, è possibile creare uno List<IA> e riempirlo con A s. La ragione di ciò è spiegata nel tutorial di Java sui generici.

+0

Cosa stavo pensando? Funziona perfettamente perché in C può anche essere un'interfaccia. Ho pensato di estendere l'ereditarietà <=>. – Gerard

1

Bene, è possibile dichiararlo a List<IA>.

Per ulteriori informazioni, Elenco può memorizzare qualsiasi oggetto che implementa IA in esso. Il problema è che, quando li si recupera, non si conosce la classe originale senza fare uno .getClass() su di esso.

Esempio:

List<IA> list = new ArrayList<IA>(); 
// code to populate list here 
for (IA item : list) { 
    item.iaMethod(); 
} 
18

Uso extends:

public void someMethod(List<? extends IB> list) { 
    for (IB e : list) { 
    // Perform some processing on each element. 
    } 
} 

public void anotherMethod() { 
    List<A> list = new ArrayList<A>(); 
    someMethod(list); 
} 

Maggiori informazioni sono disponibili all'indirizzo The Java Tutorials che ha un comprehensive lesson on Generics.

In particolare, il section on wildcards spiega come utilizzare il ? con super e extends per specificare un parametro per essere uno che è una superclasse o una sottoclasse di una data classe.

+0

Raccomando anche la sessione di Joshua Bloch di JavaOne quest'anno per maggiori informazioni. Lo ho chiarito per davvero: http: // developers.sun.com/learning/javaoneonline/sessions/2009/pdf/TS-5217.pdf – amischiefr

+0

Grazie per la risposta. – Gerard

7

Che dire:

List<? extends IA> list; 
2

È possibile farlo con extends:

List<? extends IA> list 
Problemi correlati