lambda compiler implementation - third milestone
Peter Levart
peter.levart at gmail.com
Sun May 27 02:03:28 PDT 2012
On Thursday, May 24, 2012 04:43:55 PM Maurizio Cimadamore wrote:
> Dear lambditizens,
Hello Maurizio,
I have just built the newest lambda jdk and am trying it out.
> in the last few months I've been busy updating the javac infrastructure
> in the JDK 8 repo [1..10] and then rewrote (after a couple of painful
> merge rounds ;-)) the type-checking support for lambda/method reference
> from scratch, leveraging such architectural changes. This resulted in a
> much more cohesive implementation [11], that closely reflects the
> direction the language appears to be headed in (see below). There are,
> of course, few holes and gaps here and there, but, with your help, we'll
> work towards chasing'em all.
>
> One of the most important features supported in this new implementation
> is the long-awaited generalized support for target-typing in method
> context - this means that if you call a generic method or pass a diamond
> in a method context, javac will try its best in order to figure out what
> the inferred types are. Not all situations are handled, but the obvious
> ones should work as expected.
// I have tried 2 basic use cases that someone might naively expect to work:
public class InferTest<T>
{
public <C extends Collection<T>> C test0()
{
return null;
}
public <C extends Collection<T>> C test1(C collection)
{
return collection;
}
public <C extends Collection<? super T>> C test2()
{
return null;
}
public <C extends Collection<? super T>> C test3(C collection)
{
return collection;
}
public static void main(String[] args)
{
InferTest<String> stringTest = new InferTest<>();
// case 1:
List<String> strings0 = stringTest.test0();
List<String> strings1a = stringTest.test1(new ArrayList<>());
List<String> strings1b = stringTest.<List<String>>test1(new ArrayList<>());
List<String> strings1c = stringTest.test1(new ArrayList<String>());
// case 2:
List<String> strings2 = stringTest.test2();
List<String> strings3a = stringTest.test3(new ArrayList<>());
List<String> strings3b = stringTest.<List<String>>test3(new ArrayList<>());
List<String> strings3c = stringTest.test3(new ArrayList<String>());
}
}
...
The strings0 assignment infers the C of <C>test0() as something that can be assigned to List<String>, so one might expect that such inferred type could be used to infer types in method argument context (left to right), but...
The strings1a assignment fails with:
error: method test1 in class InferTest<T> cannot be applied to given types;
required: C
found: ArrayList<Object>
reason: inferred type does not conform to declared bound(s)
inferred: ArrayList<Object>
bound(s): Collection<String>
where C,T are type-variables:
C extends Collection<String> declared in method <C>test1(C)
T extends Object declared in class InferTest
So one must either use strings1b or strings1c to make it work.
The other use-case is using a wild-card with "? super T" bound on a nested type parameter. The strings2 assignment infers C of <C>test2() as something assignable to List<String>, but...
The strings3a assignment fails with:
error: incompatible types: ArrayList<Object> cannot be converted to List<String>
So one must use either strings3b or strings3c.
Is any of the two use-cases expected to work in the new scheme?
Regards, Peter
>
> As this is a big revolution in the way in which javac type-checks method
> calls, there could be some initial hiccups - in order to reduce the
> chance of regression as much as possible we also put in place a biggie
> suite of combinatorial test cases [12] - but please, be patient as new
> bugs might be uncovered.
>
> I would like to thank the many of you who provided very valuable
> feedback and bug reports - please keep it going!
>
> Maurizio
>
> [1] - http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/51fb17abfc32
> [2] - http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/e28a06a3c5d9
> [3] - http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/568e70bbd9aa
> [4] - http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/161230ec7c73
> [5] - http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/6f0ed5a89c25
> [6] - http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/2827076dbf64
> [7] - http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/38ae13dcd215
> [8] - http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/48ee63caaa93
> [9] - http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/d2508136751c
> [10] - http://hg.openjdk.java.net/jdk8/jdk8/langtools/rev/dda6a5b15580
> [11] - http://hg.openjdk.java.net/lambda/lambda/langtools/rev/314e550e28af
> [12] - http://hg.openjdk.java.net/lambda/lambda/jdk/rev/7152aca9aef1
More information about the lambda-dev
mailing list