consideri il seguente frammento di codicePerché "Stream.collect" è sicuro per tipo e "Stream.toArray (IntFunction <A[]>)" non lo è?
String strings[] = {"test"};
final List<String> collect = java.util.Arrays.stream(strings).collect(java.util.stream.Collectors.toList());
final Double[] array = java.util.Arrays.stream(strings).toArray(Double[]::new);
Perché Java può garantire il tipo corretto nel raccogliere caso (cambiando il tipo generico di raccolta, ad esempio, doppia porta ad un errore di compilazione), ma non nel caso di matrice (compila bene, nonostante apply(int)
di Double[]::new
dà un Double[]
, non uno Object[]
, ma genera ArrayStoreException se usato in modo errato come sopra)?
Quale sarebbe il modo migliore per generare un errore di compilazione nel caso in cui modifico il tipo di flusso senza modificare l'IntFunction specificato nella chiamata aArray?
Questo è uno dei casi in cui "Un super T" sarebbe di aiuto? Se è così, allora è abbastanza interessante che non l'abbiano corretto per questo, perché mi sembra un "must" per me se è in una API simile. – skiwi
Beh, sto cercando il motivo per cui sono completamente estranei, come hai sottolineato. Mettere un '' sembrerebbe abbastanza facile. Quindi mi aspetterei qualche problema con le implementazioni dell'interfaccia Stream o qualcosa del genere. – muued
@muued Si noti che '' è * sintatticamente * non possibile nelle dichiarazioni di tipo. Puoi avere solo '? super T' come tipo, ma non puoi catturare il '?'. Questo è in contrasto con "X estende T" che può catturare "? estende T'. È stato omesso da Java nel momento in cui i generici sono stati creati perché è stato ritenuto * non abbastanza utile *. – skiwi