匿名类中的静态方法引用问题
匿名类静态方法的方法引用问题
先看这段可正常运行的"hello, world"示例:
abstract public class Main implements java.util.function.Supplier<Runnable> { public static void main(String[] args) { new Main() { private void hello() { System.out.println("hello, world"); } @Override public Runnable get() { return this::hello; } }.get().run(); } }
如果把hello方法改为static,常规静态方法引用方式会失效——因为匿名类没有显式类名,尝试hello、::hello、null::hello都会被编译器拒绝。虽然可以将静态方法移到Main类中,通过Main::hello引用,但复杂场景下我们更希望把静态方法限制在最小作用域内。
可行解决方式
1. 用Lambda表达式替代方法引用
这是最简洁的方案,匿名类内部可直接调用静态方法,用Lambda包装即可:
abstract public class Main implements java.util.function.Supplier<Runnable> { public static void main(String[] args) { new Main() { private static void hello() { System.out.println("hello, world"); } @Override public Runnable get() { return () -> hello(); // 直接调用静态方法 } }.get().run(); } }
2. 通过反射获取方法引用(不推荐)
如果一定要用方法引用形式,可通过反射获取匿名类的静态方法再转换成Runnable,但这种方式代码繁琐且失去编译期检查:
abstract public class Main implements java.util.function.Supplier<Runnable> { public static void main(String[] args) { new Main() { private static void hello() { System.out.println("hello, world"); } @Override public Runnable get() { try { Method method = this.getClass().getDeclaredMethod("hello"); method.setAccessible(true); return method::invoke; } catch (NoSuchMethodException e) { throw new RuntimeException(e); } } }.get().run(null); // 静态方法invoke第一个参数传null } }
总结
优先选择Lambda表达式方案,它既简洁又保留编译期检查,能完美满足将静态方法限制在匿名类内部的需求。
内容的提问来源于stack exchange,提问作者stefanobaghino
相关产品推荐
相关产品推荐

