| import java.util.*; |
| class MyTest { |
| |
| static void m(int i) {//here |
| } |
| static void m(Integer i) {} |
| |
| interface I { |
| void m(int x); |
| } |
| |
| static void call(I s) { s.m(42); } |
| |
| public static void main(String[] args) { |
| I s = MyTest::m; |
| s.m(42); |
| call(MyTest::m); |
| } |
| } |
| |
| class MyTest1 { |
| |
| static void m(Integer i) { } |
| |
| interface I1 { |
| void m(int x); |
| } |
| |
| interface I2 { |
| void m(Integer x); |
| } |
| |
| static void call(int i, I1 s) { |
| |
| } |
| static void call(int i, I2 s) { |
| //here |
| } |
| |
| public static void main(String[] args) { |
| call<error descr="Ambiguous method call: both 'MyTest1.call(int, I1)' and 'MyTest1.call(int, I2)' match">(1, MyTest1::m)</error>; |
| } |
| } |
| |
| class MyTest2 { |
| |
| static void m(Integer i) { } |
| |
| interface I { |
| void m(int x); |
| } |
| |
| static void call(int i, I s) { } |
| static void call(Integer i, I s) { } |
| |
| static void test() { |
| call(1, MyTest2::m); //call(int i, I s) |
| } |
| } |
| |
| class MyTest3 { |
| interface I { |
| void m(); |
| } |
| |
| MyTest3() {} |
| |
| static void m() { } |
| |
| public static void main(String[] args) { |
| I s = <error descr="Static method referenced through non-static qualifier">new MyTest3()::m</error>; |
| } |
| } |
| |
| class MyTest4 { |
| |
| interface I { |
| MyTest4 m(List<Integer> l1, List<Integer> l2); |
| } |
| |
| MyTest4 meth(List<Integer>... lli) { return null; } |
| MyTest4(List<Integer>... lli) { } |
| |
| I s1 = this::meth; |
| I s2 = MyTest4::new; |
| } |
| |
| class MyTest5 { |
| interface I_void<X> { |
| void m(); |
| } |
| |
| interface I_Void<X> { |
| void m(); |
| } |
| |
| static void m_void() {} |
| |
| static Void _Void() {return null; } |
| |
| public static void main(String[] args) { |
| I_void s1 = MyTest5::m_void; |
| s1.m(); |
| I_Void s2 = MyTest5::m_void; |
| s2.m(); |
| I_void s3 = MyTest5::_Void; |
| s3.m(); |
| I_Void s4 = MyTest5::_Void; |
| s4.m(); |
| } |
| } |
| class MyTest6 { |
| interface I { |
| MyTest6 invoke(); |
| } |
| |
| MyTest6() { |
| } |
| |
| static MyTest6 m() { |
| return null; |
| } |
| |
| public static void main(String[] args) { |
| I I1 = ((I)() -> {return null; })::invoke; |
| I1.invoke(); |
| I I2 = ((I)MyTest6::new)::invoke; |
| I1.invoke(); |
| I I3 = ((I)MyTest6::m)::invoke; |
| I1.invoke(); |
| } |
| } |
| |
| class MyTest7{ |
| |
| interface I<R> { |
| R invoke(); |
| } |
| |
| @interface A { } |
| |
| static abstract class AC { } |
| |
| enum E { } |
| |
| void test() { |
| I s1 = <error descr="'A' is abstract; cannot be instantiated">A::new</error>; |
| I s2 = <error descr="'I' is abstract; cannot be instantiated">I::new</error>; |
| I s3 = <error descr="'AC' is abstract; cannot be instantiated">AC::new</error>; |
| I s4 = <error descr="Enum types cannot be instantiated">E::new</error>; |
| } |
| } |
| |
| class MyTest8{ |
| |
| static class Sup {} |
| |
| |
| static class Sub extends Sup { |
| |
| interface I { Sup m(Sup x, String str); } |
| |
| class Inner extends Sup { |
| Inner(String val) { } |
| } |
| |
| void test() { |
| I var = Sub.Inner::<error descr="Cannot resolve constructor 'Inner'">new</error>;; |
| } |
| } |
| } |
| |
| class MyTest9 { |
| |
| static class SuperFoo<X> { } |
| |
| static class Foo<X extends Number> extends SuperFoo<X> { } |
| |
| interface I1 { |
| void m(); |
| } |
| |
| interface I2 { |
| void m(); |
| } |
| |
| static <X extends Number> Foo<X> m() { return null; } |
| |
| static void g1(I1 s) { } |
| static void g2(I1 s) { } |
| static void g2(I2 s) { } |
| |
| void test() { |
| g1(MyTest9::m); |
| g2<error descr="Ambiguous method call: both 'MyTest9.g2(I1)' and 'MyTest9.g2(I2)' match">(MyTest9::m)</error>; |
| } |
| } |