【发布时间】:2014-03-30 00:54:49
【问题描述】:
我正在使用 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)
为什么 javac / maven 在编译时没有失败,但仍然产生无效的字节码?
编辑:问题似乎远比简单的调用复杂,这是重现它所需的代码:
import java.util.function.Function;
/**
* @author Yawkat
*/
public class Test {
public static void main(String[] args) { new Test().runTest(); }
private void runTest() {
Worker worker = new Worker();
run(() -> worker.print(field -> new SomeClass(field)));
run(() -> worker.print(SomeClass::new));
}
private void run(Runnable runnable) {
runnable.run();
}
private class SomeClass {
final Object field;
SomeClass(Object field) {
this.field = field;
}
}
private static class Worker {
void print(Function<Object, Object> i) {
System.out.println(i.apply(null));
}
}
}
【问题讨论】:
-
你能给我们一个可重现的小代码sn-p吗?
-
@SotiriosDelimanolis 我不得不做更多的研究,因为所需的代码比我想象的要复杂得多。我加了。
-
看起来像一个 JVM 错误。请考虑提交错误报告。
-
这是一个 javac 错误,而不是 JVM 错误。请参阅有关 Rohit Jain 答案的评论主题。
标签: java lambda inner-classes java-8 constructor-reference