我正在使用lambda为内部类构造函数创建供应商ctx -> new SpectatorSwitcher(ctx).IntelliJ建议我将其SpectatorSwitcher::new改为.SpectatorSwitcher是我正在使用的类的非静态内部类.建议的代码编译得很好(使用maven)但我在执行时得到以下VerifyError:
Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
Test.lambda$runTest$8(LTest$Worker;)V @2: invokedynamic
Reason:
Type 'Test$Worker' (current frame, stack[1]) is not assignable to 'Test'
Current Frame:
bci: @2
flags: { }
locals: { 'Test$Worker' }
stack: { 'Test$Worker', 'Test$Worker' }
Bytecode:
0000000: 2a2a ba00 0b00 00b6 000c b1
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
at java.lang.Class.getMethod0(Class.java:2937)
at java.lang.Class.getMethod(Class.java:1771)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Run Code Online (Sandbox Code Playgroud)
为什么javac/maven在编译时没有失败但仍然产生无效的字节代码?
编辑:问题似乎比简单调用复杂得多,这是重现它所需的代码:
import java.util.function.Function;
/**
* @author …Run Code Online (Sandbox Code Playgroud) 我一直在阅读我使用的API实现的源代码,并偶然发现了这部分代码:
if (condition1 & condition2 && (condition3 || condition4))
Run Code Online (Sandbox Code Playgroud)
条件1和2不会调用任何方法或执行任何操作,而3和4则不会.我想知道为什么程序员决定不使用短路&&运算符来比较前两个语句,因为我看不到使用它的任何好处(还有一个条件要检查,另外两个条件可能对其他条件有任何影响)部分程序仍然是短路的.