Hi John,
Thanks for the insight, I hope it will help cut down on the thrashing.
Isn't there a 4th form that throws missing?
There was quite a bit of support for a version the never returned null
and threw an exception if the replacement was null.
Thanks, Roger
On 10/8/2015 5:26 PM, John Rose wrote:
On Oct 8, 2015, at 12:34 PM, fo...@univ-mlv.fr
<mailto:fo...@univ-mlv.fr> wrote:
Anyway, in this case the problem is not just overloading, it is the
mix of overloading and type inference as you said.
Add type erasure to this cocktail, and it's perfect.
My antennae go up when the erased types overlap. When they do,
there's usually a sad story (with puzzlers) waiting to appear.
On 7 October 2015 at 23:24, Roger Riggs <roger.ri...@oracle.com
<mailto:roger.ri...@oracle.com>> wrote:
Please consider and comment:
<T> T nonNullOf(T obj, T defaultObj);
<T> T nonNullOf(T, obj, Supplier<T> defaultSupplier);
Details are in the updated webrev:
http://cr.openjdk.java.net/~rriggs/webrev-object-non-null/
<http://cr.openjdk.java.net/%7Erriggs/webrev-object-non-null/>
In this case, the erased types are Object(Object, Object) and
Object(Object, Supplier).
So the source language (usually) makes all needed distinctions, but
the bytecodes are full of ambiguity. And nulls are wonderful carriers
of ambiguity, at both source and bytecode levels.
Please align this API point with the closely analogous points already
found in java.util.Optional. In particular, a third throwing form
looks right.
Those are my substantive comments.
Now for bikeshed comments.
I don't like "Of" here, which doesn't appear in Optional, and seems to
be used more frequently for factory methods.
I suggest using Optional::orElse* method names, but kill leading noise
word "or". "Non-null else foo" is good programmer talk for "non-null
or else foo". (Speculation: The "or" is present in Optional mainly
to avoid reserved word "else".)
- nonNullElse(T,T) (cf. Optional::orElse)
- nonNullElseGet(T,Supplier<T>) (cf. Optional::orElseGet)
- nonNullElseThrow(T,Supplier<X>) (cf. Optional::orElseThrow)
— John