2013-08-20 11 views
13

Ho letto Java efficace e ho trovato il tipo di Raccolta illimitato <?>. Tuttavia, la lettura mi ha portato a credere che non sia possibile inserire elementi, ad eccezione di null, in un'istanza di Collection<?>.Qual è il punto della collezione <?>

Quindi, la mia domanda è questa: qual è lo scopo di istanziare un Collection<?> quando possiamo solo inserire gli elementi null come sembra inutile. Ho cercato di capire questo concetto, ma non sembra avere molto senso. Qualsiasi aiuto sarebbe molto apprezzato.

+0

Ho pensato che efficace Java dice che la raccolta è sicura. – blackpanther

+0

http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html – LaurentG

risposta

24

Collection<?> consente di creare, tra le altre cose, metodi che accettano qualsiasi tipo di Collection come argomento. Per esempio, se si desidera un metodo che restituisce true se un qualsiasi elemento in un Collection è uguale a un certo valore, si potrebbe fare qualcosa di simile:

public boolean collectionContains(Collection<?> collection, Object toCompareTo) { 
    for (Object o : collection) { 
     if (toCompareTo.equals(o)) return true; 
    } 
    return false; 
} 

Questo metodo può essere chiamato da qualsiasi tipo di Collection:

Set<String> strings = loadStrings(); 
collectionContains(strings, "pizza"); 

Collection<Integer> ints = Arrays.toList(1, 2, 3, 4, 5); 
collectionContains(ints, 1337); 

List<Collection<?>> collections = new ArrayList<>(); 
collectionContains(collections, ILLEGAL_COLLECTION); 
+0

Intendi metodi anziché funzioni. – blackpanther

+1

Derp, si, mio ​​cattivo. – Smallhacker

5

si consideri il seguente metodo Util from docs

il metodo seguente vi mostra come utilizzare un iteratore per filtrare una raccolta arbitraria - cioè, attraversa la raccolta rimuovendo elementi specifici.

static void filter(Collection<?> c) { 
    for (Iterator<?> it = c.iterator(); it.hasNext();) 
     if (!cond(it.next())) 
      it.remove(); 
} 

Questo semplice pezzo di codice è polimorfico, il che significa che funziona per qualsiasi Collection indipendentemente attuazione.

1

Quando si dichiara una raccolta con caratteri jolly, si specifica che la raccolta è un supertipo di tutti i tipi di raccolte.

Questo è molto utile quando si dispone di un metodo su cui si vorrebbe far passare tutti i tipi di raccolta diciamo per esempio:

void printCollection(Collection<?> c) { 
    for (Object e : c) { 
     System.out.println(e); 
    } 
} 

Dai un'occhiata alla Oracle's documentation sulla wild card in quanto è molto esaustivo.

1

Collection è l'astrazione più bassa di tutti Lists e Sets. È bene usare l'astrazione più bassa che si può usare, perché in futuro ti darà più flessibilità e il tuo codice è più robusto, perché può gestire tutto lo Lists o Sets o altre implementazioni, che non devono ancora essere implementate.

Bene, la raccolta è in qualche modo equivalente a Collection<Object>. Significa semplicemente che il tipo generico degli oggetti archiviati in Collection è sconosciuto oppure è possibile utilizzare l'astrazione più bassa di qualsiasi oggetto che sia Object stesso. In questo caso è possibile inserire in Collection qualsiasi oggetto anche mescolare con tipi diversi. Ma bisogna essere consapevoli di scriverlo nel tipo corretto in fase di esecuzione perché non hai fornito il tipo di oggetto che la tua raccolta sta archiviando. Quindi, la Collezione non può lanciare l'Oggetto al tipo giusto per te, devi farlo da solo. Per riconoscere il tipo corretto è necessario utilizzare Object instanceof SomeOtherClass o Class.isAssignableFrom(Class) in fase di esecuzione.

Anche Collection non implementa il metodo get() ma è possibile ottenere Iterator e ottenere oggetto dalla raccolta in questo modo.

Problemi correlati