package todelete; class MyTest { interface Bar1 { int m(String s); } interface Bar2 { int m(int s); } void bar(Bar1 b1){} void bar(Bar2 b1){} static int foo(int i) { return 0; } static int foo(String i) { return 0; } { Bar1 b1 = MyTest :: foo; bar<error descr="Ambiguous method call: both 'MyTest.bar(Bar1)' and 'MyTest.bar(Bar2)' match">(MyTest :: foo)</error>; } } class MyTest1 { interface Bar1 { int m(String s); } interface Bar2 { int m(int s); } //void bar(Bar1 b1){} void bar(Bar2 b1){} static int foo(int i) { return 0; } static int foo(String i) { return 0; } { Bar1 b1 = MyTest2 :: <error descr="Cannot resolve method 'foo'">foo</error>; bar(MyTest1 :: foo); } } class MyTest2 { interface Bar1 { int m(String s); } interface Bar2 { int m(int s); } void bar(Bar1 b1){} void bar(Bar2 b1){} static int foo(int i) { return 0; } /*static int foo(String i) { return 0; }*/ { Bar1 b1 = MyTest2 :: <error descr="Cannot resolve method 'foo'">foo</error>; bar(MyTest2 :: foo); } } class MyTest3 { interface Bar1 { int m(String s); } interface Bar2 { int m(int s); } //void bar(Bar1 b1){} void bar(Bar2 b1){} /*static int foo(int i) { return 0; }*/ static int foo(String i) { return 0; } { Bar1 b1 = MyTest2 :: <error descr="Cannot resolve method 'foo'">foo</error>; bar(MyTest3 :: <error descr="Cannot resolve method 'foo'">foo</error>); } } class MyTest4 { interface Bar1<T> { int m(T s); } void bar(Bar1 b1){} static int foo(int i) { return 0; } static int foo(String i) { return 0; } { bar(MyTest4:: <error descr="Cannot resolve method 'foo'">foo</error>); } } class MyTest5 { interface Bar1<T> { int m(T s); } static <T1> void bar(Bar1<T1> b1){} static <K> int foo(K k) { return 0; } static int foo(String i) { return 0; } { //todo ambiguity rules checked MyTest5.<String>bar(MyTest5::foo); } } class MyTest6 { interface I { void m(Integer i); } static void foo(Number i) {} static void foo(Integer i, String s) {} static void foo(Integer d) {} public static void main(String[] args) { I s = MyTest6::foo; s.m(1); } } class MyTest7 { interface I { void m(Number i); } static void foo(Number i) {} static void foo(Integer i, String s) {} static void foo(Integer d) {} public static void main(String[] args) { I s = MyTest7::foo; s.m(1); } }