On 3/21/19 2:17 PM, fo...@univ-mlv.fr wrote:
for some reason i was convinced that IntStream.iterator() was returning a 
PrimitiveIterator.OfInt and not an Iterator<Integer>,
so yes, it will work but i don't understand why it's not BaseStream instead of 
Stream<Object> that inherits from Iterable.

I think it's the Iterable.forEach(Consumer<? super T>) that would clash with IntStream.forEach(IntConsumer), LongStream.forEach(LongConsumer) and DoubleStream.forEach(DoubleConsumer) if Iterable was a supertype of BaseStream.

...unless IntConsumer was made to extend Consumer<Integer>, LongConsumer was made to extend Consumer<Long> and DoubleConsumer was made to extend Consumer<Double>...

I tried that and it (almost) compiles. The sole problem presents the following class:

    public class LongSummaryStatistics implements LongConsumer, IntConsumer { ...

So I had another idea. What if IntConsumer, LongConsumer and DoubleConsumer were all made to extend Consumer<Number> ?

In that case LongSummaryStatistics would only have to override the method to disambiguate it.

By doing that, the problem springs in java.util.stream.Sink hierarchy (Sink<T> extends Consumer<T>) where Sink.OfInt extends both Sink<Integer> and IntConsumer...

Perhaps this could be fixed (as it is internal non-public API), but the same problem could exist in 3rd party code...

Regards, Peter

Reply via email to