enhanced type-inference
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Jan 28 08:25:04 PST 2013
This just got fixed - let me know how it works for you
Maurizio
On 27/01/13 15:35, Boaz Nahum wrote:
> 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