2017-12-02 6 views
2

Ich verstehe nicht, warum Raw-Typ Predicate Kompilierungsfehler verursacht, selbst wenn ich eine Art Besetzung habe. Schauen wir uns das folgende Beispiel aussehen:Rohtyp-Prädikat verursacht Kompilierungsfehler

Aus einer Liste mit verschiedenen Objekten diejenigen erhalten, die Number verlängern, gegossen in eine Number und sammeln zu einem List.

List<Object> objectList = Arrays.asList(1, 3.4, 2, new Object(), ""); 

List<Number> numbers = objectList 
     .stream() 
     .filter(Number.class::isInstance) 
     .map(Number.class::cast) 
     .collect(Collectors.toList()); 

Lassen Sie uns das Gleiche tun, aber diesmal wollen wir werfen Number.class::isInstance-Predicate:

Dies führt zu einem Übersetzungsfehler:

Error:(28, 25) java: incompatible types: java.lang.Object cannot be converted to java.util.List

Es ist eine Besetzung nach einer filter Betrieb .map(Number.class::cast) und .collect(Collectors.toList()); Aber der letzte Typ ist java.lang.Object. Warum denken Sie, der Ergebnistyp ist java.lang.Object und nicht ein List<Number>?

Antwort

1
  1. Wie Sie einen rohen Typen filter geliefert haben, gibt es eine rohes Stream.
  2. Normalerweise wäre map<R> Stream<R> Stream<T>::map(Function<? super T, ? super R> function). Aber jetzt gibt es keine T, so dass das Argument gezwungen wird, ein roher Function Typ zu sein, so map endet auch eine rohe Rückkehr Stream.
  3. Eine ähnliche Logik bedeutet, dass collect eine Object zurückgibt.
Verwandte Themen