Optional.or() doesn't use a wildcard in its signature

Stefan Zobel spliterator at gmail.com
Sun Nov 1 12:31:02 UTC 2015


2015-11-01 1:12 GMT+01:00 Michael Nascimento <misterm at gmail.com>:
> Hi Vitaly,
>
> Exactly, I was just trying to point out the method signature seems broken
> anyway.
>
> Regards,
> Michael


Hi Michael,

I don't think the signature is broken.

An Optional<StringBuilder> is not a subtype of Optional<CharSequence>.
So even if the signature were

public <R extends T> Optional<T> or(Supplier<Optional<R>> supplier)

we'd have to upcast the result of supplier.get() to Optional<T>
which appears to be wrong from a type perspective.


Regards,
Stefan



>
> On 31 Oct 2015 11:59, "Vitaly Davidovich" <vitalyd at gmail.com> wrote:
>>
>> This would require Supplier<Optional<? extends T>>, not Supplier<? extends
>> Optional<T>>.
>>
>> sent from my phone
>>
>> On Oct 31, 2015 2:49 PM, "Michael Nascimento" <misterm at gmail.com> wrote:
>>>
>>> If this instance is an Optional<CharSequence> ,  passing an
>>> Optional<StringBuilder> will fail to compile.
>>>
>>> Regards,
>>> Michael
>>> On 31 Oct 2015 11:21, "Stefan Zobel" <spliterator at gmail.com> wrote:
>>>
>>> > 2015-10-31 19:11 GMT+01:00 Remi Forax <forax at univ-mlv.fr>:
>>> >
>>> > > Hi all, hi Paul,
>>> > >
>>> > > I've just seen that Optional.or is declared as
>>> > >   public Optional<T> or(Supplier<Optional<T>> supplier) {
>>> > > instead of
>>> > >   public Optional<T> or(Supplier<? extends Optional<T>> supplier) {
>>> > >
>>> > > regards,
>>> > > Rémi
>>> > >
>>> >
>>> >
>>> > I don't get it. Optional is final anyway. Can you explain?
>>> >
>>> > Thanks,
>>> > Stefan



More information about the core-libs-dev mailing list