RFR(s): 8152617 add missing wildcards to Optional or() and flatMap()
Stuart Marks
stuart.marks at oracle.com
Fri Oct 7 21:38:57 UTC 2016
On 10/7/16 12:40 PM, Stefan Zobel wrote:
> What's wrong with the alternative "additional bounded type parameter" approach?
>
> Couldn't we also get by with something like
>
> <V, U extends V> Optional<V> flatMap(Function<? super T, Optional<U>> mapper)
>
> and
>
> <S extends T> Optional<T> or(Supplier<Optional<S>> supplier)
>
> Personally, I find that much easier to digest. But that's only me, of course.
Yes, the additional type parameter seems to work for this example. I'm a bit
surprised.
I think it's mostly a style thing. To me, a type parameter carries a certain
amount of semantic weight, implying that it's a concern that the caller needs to
pay attention to. (Note that type parameters are documented using the javadoc
@param tag, and by convention every parameter must be documented.) By contrast,
a wildcard says "anything that satisfies the constraints" but we don't care
exactly what it is.
If a type parameter is used only once, it can (always, I think) be replaced by a
wildcard. After having looked at lots of generic APIs, it seems to me that a
style has emerged where wildcards are used whenever possible, and type
parameters are used only when necessary, e.g. when the exact same type is
required in multiple places. I don't know if this is actually written down
anywhere though.
A difference *would* arise between the multiple-wildcards and
additional-type-parameter approaches, if it were possible to have subclasses of
Optional.
Of course, it doesn't apply to this case, since Optional is final, and we have
no plans to make it non-final!
s'marks
More information about the core-libs-dev
mailing list