2014-05-21 9 views
12

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?

risposta

9

La firma del metodo Stream::toArray ha il seguente aspetto. Si noti che i parametri di tipo T e A non sono completamente correlati.

public interface Stream<T> { 
    <A> A[] toArray(IntFunction<A[]> generator); 
} 

nella fonte di ReferencePipeline.java, è possibile trovare il seguente commento:

Dal A non ha alcuna relazione con U (non è possibile dichiarare che A è un limite superiore di U) ci sarà non essere un controllo di tipo statico. Pertanto, utilizzare un tipo non elaborato e assumere A == U anziché propagare la separazione di A e U in tutto il code-base. Il tipo di runtime di U non viene mai verificato per l'uguaglianza con il tipo di componente del tipo di runtime A[]. Il controllo del runtime verrà eseguito quando un elemento è memorizzato in A[], quindi se A non è un tipo U uno ArrayStoreException verrà generato.

+0

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

+0

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

Problemi correlati