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(MyTest :: foo); } } 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 :: foo; 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 :: foo; 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 :: foo; bar(MyTest3 :: foo); } } class MyTest4 { interface Bar1 { int m(T s); } void bar(Bar1 b1){} static int foo(int i) { return 0; } static int foo(String i) { return 0; } { bar(MyTest4:: foo); } } class MyTest5 { interface Bar1 { int m(T s); } static void bar(Bar1 b1){} static int foo(K k) { return 0; } static int foo(String i) { return 0; } { //todo ambiguity rules checked MyTest5.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); } }