Domanda

    

Questa domanda ha già una risposta qui:

         

Supponiamo che la classe B estenda la classe A. Ho un List<A> che per caso conosco solo contiene istanze di List<B>. C'è un modo in cui posso trasmettere <=> a <=>?

Sembra che la mia unica opzione sia quella di scorrere la raccolta, lanciare un elemento alla volta, creare una nuova raccolta. Questo sembra uno spreco totale di risorse, dato che la cancellazione del tipo lo rende completamente inutile in fase di esecuzione.

È stato utile?

Soluzione

Puoi trasmettere attraverso l'interfaccia Elenco non tipizzata:

List<A> a = new ArrayList<A>();
List<B> b = (List)a;

Altri suggerimenti

Puoi provare questo:

List<A> a = new ArrayList<A>();
List<B> b = (List<B>) (List<?>) a;

Si basa sulla risposta di jarnbjo, ma su non utilizzare elenchi non elaborati.

List<A> non è non un sottotipo di List<B>!

JLS menziona anche che esplicitamente :

  

Il sottotipo non si estende attraverso tipi generici: T <: U non implica che C<T> <: C<U>.

Un modo per mantenere un certo tipo di sicurezza con un impatto minimo sulle prestazioni è utilizzare un wrapper . Questo esempio riguarda Collection, il caso List sarebbe molto simile e forse un giorno scriverò anche quello. Se qualcun altro viene prima di me, ti preghiamo di condividere il codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top