Extending Collector to handle a post-transform

Remi Forax forax at univ-mlv.fr
Tue Jun 11 12:16:51 PDT 2013


On 06/11/2013 09:02 PM, Brian Goetz wrote:
>
>
> On 6/11/2013 1:44 PM, Tim Peierls wrote:
>> On Tue, Jun 11, 2013 at 1:26 PM, Brian Goetz <brian.goetz at oracle.com
>> <mailto:brian.goetz at oracle.com>> wrote:
>>
>>         Yes, it's not yet "all gain, no pain".  Where I am now, the
>>         existence of an internal type still appears; Collector takes
>>         type arguments <T, I, R> (input, intermediate, result), but all
>>         the occurrences of Collector in the API specify ? as the second
>>         parameter:
>>
>>
>>          public static Collector<String, ?, String> toStringBuilder()
>>
>>
>> That's not as bad as I feared, but given the importance of Collector to
>> the whole Stream framework, I'm still worried about scaring people away
>> with mysterious type parameters. Could Collector<T, R> extend
>> BaseCollector<T, X, R>? Implementers of the latter care about X, clients
>> of the former don't.
>
> I haven't been able to make this work nicely.  You can move the ugly 
> somewhere else, but its not clear whether it is a win.
>
> For example, you could not do:
>
>   interface BaseCollector<T,I,R> {
>       Supplier<I> resultSupplier();
>       BiFunction<I,T,I> accumulator();
>       ...
>   }
>
>   interface Collector<T,R> extends BaseCollector<T,?,R> { }
>
> (compile-time error).
>
> You could do:
>
>   interface Collector<T,R> extends BaseCollector<T,Object,R> { }
>
> which is arguably uglier, and now we're getting into the "poor man's 
> typedef antipattern", since the interface Collector does nothing 
> except to obfuscate the type arguments of BaseCollector.

if there is no post transformation, It should be R.
    interface Collector<T,R> extends BaseCollector<T,R,R> { }

no ?

Rémi



More information about the lambda-libs-spec-experts mailing list