enhanced type-inference
Boaz Nahum
boaznahum at gmail.com
Sun Jan 27 07:35:02 PST 2013
I hope it is not tool late to remind:
The below code is no longer valid in JDK 8:
private interface Key<T> { }
private static class Broker {
<T> T getValue(Key<T> key) {...}
}
Broker broker = new Broker();
Key<Integer> ki = new Key<Integer>() {};
* // fails with error:
// java: incompatible types: inferred type does not conform to
upper bound(s)
// inferred: java.lang.Integer
// upper bound(s): java.lang.Double,java.lang.Object*
double d3 = broker.getValue(ki);
I was already explained why the error. With 3M lines of code, we only can
wait for it to be fixed - or not.
Thanks
Boaz
On Sun, Jan 27, 2013 at 2:10 PM, Peter Levart <peter.levart at gmail.com>wrote:
> Very nice, indeed. Congratulations!
>
> We now hardly need casts if APIs are written correctly.
>
> One idea that might make the remaining needed casts more concise, but I
> don't know how it would play with this new inference scheme, is a kind
> of "diamond cast". For example, to disambiguate two overloaded methods
> with interchangeable SAM types used for arguments:
>
> interface F<P, R> { R apply(P p); }
>
> interface G<P, R> { R apply(P p); }
>
> class C {
> void m(F<String, Integer> f);
> void m(G<String, Integer> g);
> }
>
> C c = ...;
>
> c.m(s -> s.length()); // ambiguous
>
> c.m((G<String, Integer>) s -> s.length()); // ok, but long
> c.m((F<>) s -> s.length()); // concise
>
>
> Regards, Peter
>
> On 01/25/2013 06:49 PM, Maurizio Cimadamore wrote:
> > Dear lambdackers,
> > I've just pushed a patch that enables a more general inference support
> > for nested generic method calls/stuck expressions. This scheme has been
> > available for a while in lambda-repo (when using the hidden flag
> > -XDuseGraphInference), but we have now decided it's time to flip the
> > switch and make it the default when using JDK 8. In the past few weeks
> > I've been hunting down as many bugs in the new inference scheme as
> > possible, in order to provide a smooth transition from the old world to
> > the new one. I hope the transition is indeed smooth - but, given the
> > nature of the change, I also expect bugs to pop up here and there, so
> > please, keep throwing the kitchen sink at javac and report your
> > experience back to us; without your valuable feedback and dedication we
> > would never have gotten thus far.
> >
> > Example of things that now work:
> >
> > Stream<Integer> si = ...
> > List<Integer> l1 = si.into(new ArrayList<>()); //not really - too
> > late for that ;-)
> > List<Integer> l2 = si.collect(toList());
> > List<Integer> l3 = si.collect(toCollection(ArrayList::new));
> >
> > Thanks
> > Maurizio
> >
> >
>
>
>
More information about the lambda-dev
mailing list