Per rispondere alla tua seconda domanda, sì, si può lanciare la List<?>
come List<Object>
o un List<T>
di qualsiasi tipo, in quanto il parametro ?
(jolly) indica che l'elenco contiene una raccolta omogenea di un qualsiasiObject
. Tuttavia, non c'è modo di sapere al momento della compilazione cosa è il type
poiché è solo parte dell'API esportata, il che significa che non è possibile vedere cosa viene inserito nello List<?>
.
Ecco come si dovrebbe fare il cast:
List<?> wildcardList = methodThatReturnsWildcardList();
// generates Unchecked cast compiler warning
List<Object> objectReference = (List<Object>)wildcardList;
In questo caso è possibile ignorare l'avviso perché in modo che un oggetto da utilizzare in una classe generica deve essere un sottotipo di Object
. Supponiamo che stiamo provando a trasmettere questo come List<Integer>
quando in realtà contiene una raccolta di String
s.
// this code will compile safely
List<?> wildcardList = methodThatReturnsWildcardList();
List<Integer> integerReference = (List<Integer>)wildcardList;
// this line will throw an invalid cast exception for any type other than Integer
Integer myInteger = integerRefence.get(0);
Ricordare: i tipi generici vengono cancellati in fase di esecuzione. Non si sa cosa contiene la raccolta, ma è possibile ottenere un elemento e chiamare .getClass()
su di esso per determinare il suo tipo.
Class objectClass = wildcardList.get(0).getClass();
fonte
2016-04-15 20:32:30
OK, se voi ragazzi dite che "Elenco >" non può essere istanziato, allora com'è che il metodo può restituirlo? – Chris
Vale la pena notare che 'Arrays.asList (T ... a)' restituisce un 'Elenco'. È possibile inizializzare 'List' con' List