Playing with new compiler
Ali Ebrahimi
ali.ebrahimi1781 at gmail.com
Wed May 25 00:21:51 PDT 2011
Hi Maurizio,
I play with new compiler and have some questions.
public class AMBTest {
static interface SAM1 {
String m1(Integer n) throws Exception;
}
static interface SAM2 {
void m2(Integer n);
}
static interface SAM<R,A> {
R m(A n);
}
static void call(SAM1 sam) {
System.out.println("SAM1");
}
static void call(SAM2 sam) {
System.out.println("SAM2");
}
static <R,A> void call(SAM<R,A> sam) {
System.out.println("SAM");
}
public static void main(String[] args) {
call(#{ x -> System.out.println(x); return ""; }); // prints "SAM1"
call(#{ x -> System.out.println(x); return ; }); // prints "SAM2"
call(#{ x -> System.out.println(x);}); /* compile :
reference to call is ambiguous, both method call(SAM1) in AMBTest and
method call(SAM2) in AMBTest match
*/
call(#{ x -> System.out.println(x); return (Object) null; });
/*compile error: no suitable method found for call(<lambda>) method
AMBTest.<R,A>call(SAM<R,A>) is not applicable (cyclic inference - try
specifying lambda parameter types)
method AMBTest.call(SAM2) is not applicable (actual argument <lambda>
cannot be converted to SAM2 by method invocation conversion
(incompatible return type Object in lambda expression))
method AMBTest.call(SAM1) is not applicable (actual argument <lambda>
cannot be converted to SAM1 by method invocation conversion
(incompatible return type Object in lambda expression))
where R,A are type-variables:
R extends Object declared in method <R,A>call(SAM<R,A>)
A extends Object declared in method <R,A>call(SAM<R,A>)
*/
call(#{ x -> System.out.println(x); return null; }); //prints
"SAM1" ?????
}
}
Are results expected?
Best Regards,
Ali Ebrahimi
More information about the lambda-dev
mailing list