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