Diamonds: cyclic inference error
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Oct 15 09:10:03 PDT 2012
On 15/10/12 17:06, Sam Pullara wrote:
> I'm disappointed this doesn't work by the spec. I've seen a few cases
> like this where <> and lambda don't really mix. Anything we can do
> about it so that statements like this one are properly inferred?
We are currently discussing more complete solutions, such as having a
better inference strategy (which you can already experiment with using
the flag -XDuseGraphInference), to better out-of-order method checking
logic.
Maurizio
>
> Sam
>
> On Mon, Oct 15, 2012 at 7:50 AM, Maurizio Cimadamore
> <maurizio.cimadamore at oracle.com
> <mailto:maurizio.cimadamore at oracle.com>> wrote:
>
> On 15/10/12 15:21, Aleksey Shipilev wrote:
> > Hi guys, and Maurizio specifically :)
> >
> > This is the test which fails to compile with current lambda/lambda:
> >
> > ------------- 8<
> -------------------------------------------------------
> >
> > public class NoiseSampleTest {
> >
> > @Test
> > public void testL() {
> > Map<String, Map<String, Counter>> map =
> > new ComputeTreeMap<>(
> > (s) -> new ComputeTreeMap<>(
> > (x) -> new Counter()
> > )
> > );
> >
> > Assert.assertEquals(1, map.get("foo").get("bar").inc());
> > Assert.assertEquals(2, map.get("foo").get("bar").inc());
> > }
> >
> > public static class ComputeTreeMap<K, V> extends TreeMap<K,V> {
> >
> > public ComputeTreeMap(Mapper<K, V> map) {
> > // do nothing
> > }
> >
> > @Override
> > public V get(Object key) {
> > throw new UnsupportedOperationException();
> > }
> > }
> >
> > public static class Counter {
> > private int count = 0;
> > public int inc() {
> > return ++count;
> > }
> > }
> > }
> >
> > -------------- 8<
> ----------------------------------------------------
> >
> > javac says:
> > com/oracle/lambda/NoiseSampleTest.java:[16,16] error: cannot
> infer type
> > arguments for ComputeTreeMap<>
> > [ERROR] cyclic inference - cannot infer target type for given
> > lambda/method reference expression
> >
> > ...and if I write out the explicit type arguments within the
> diamond,
> > the test compiles well. Is this a spec-ed behavior, or just a bug?
> This is the spec'd behavior, yes. You are passing an implicit
> lambda to
> a method where the target type contains inference variables
> (because of
> diamond). Which means javac doesn't know what the lambda parameter
> types
> should be inferred to. Javac would try to delay type-checking of the
> lambda expression as much as possible (to see if other inference
> constraints can be derived from remaining argument expression) -
> but in
> this case there's no additional arguments. Either you specify the type
> of the diamond, or you specify the explicit lambda parameter type.
>
> Maurizio
> >
> > -Aleksey.
> >
>
>
>
More information about the lambda-dev
mailing list