gpt4 book ai didi

java - 使用 ECJ 的 Lambda/默认方法/类型删除怪癖/错误?

转载 作者:搜寻专家 更新时间:2023-10-31 20:33:34 29 4
gpt4 key购买 nike

今天遇到这个问题,花了很长时间试图重现/弄清楚发生了什么。有人可以解释为什么会发生这种情况,或者这是类型删除/默认方法/lambda/多态性的错误吗?取消对默认方法的注释使其运行良好,但我希望它能按原样工作

输出:

Works fine with an object
Calling consume
Hello
Calling accept with context
Hello
Calling accept via consumer...
Exception in thread "main" java.lang.AbstractMethodError: Method test/LambdaTest$$Lambda$1.accept(Ljava/lang/Object;)V is abstract
at test.LambdaTest$$Lambda$1/834600351.accept(Unknown Source)
at test.LambdaTest.main(LambdaTest.java:24)

代码

package test;

import java.util.function.Consumer;

public class LambdaTest {

public static void main(String[] args) {
Consumer<Context> contextIgnoringObject = new ContextUnawareObject();
contextIgnoringObject.accept(new Context());

ContextIgnorer contextIgnoringLambda = () -> {
System.err.println("Hello");
};

System.err.println("Calling consume");
contextIgnoringLambda.consume();

System.err.println("Calling accept with context");
contextIgnoringLambda.accept(new Context());

Consumer<Context> consumer = contextIgnoringLambda;

System.err.println("Calling accept via consumer...");
consumer.accept(new Context());

}

@FunctionalInterface
public interface ContextIgnorer extends Consumer<Context> {

// default void accept(Object object) {
// System.err.println("Manual bridge method");
// accept((Context)object);
// }

@Override
default void accept(Context context) {
consume();
}

void consume();

}

public static class ContextUnawareObject implements ContextIgnorer {

@Override
public void consume() {
System.err.println("Works fine with an object");
}

}

public static class Context {

}

}

最佳答案

问题出现在较旧的 ECJ 编译器 (3.10.0) 中:

$ java -jar org.eclipse.jdt.core-3.10.0.v20140604-1726.jar -source 1.8 LambdaTest.java 
$ java LambdaTest
Works fine with an object
Calling consume
Hello
Calling accept with context
Hello
Calling accept via consumer...
Exception in thread "main" java.lang.AbstractMethodError: Method LambdaTest$$Lambda$1.accept(Ljava/lang/Object;)V is abstract
at LambdaTest$$Lambda$1/424058530.accept(Unknown Source)
at LambdaTest.main(LambdaTest.java:24)

使用 org.eclipse.jdt.core_3.10.0.v20140902-0626.jar 或更新版本可以解决问题。 Oracle javac 编译器没有这个问题。因此,解决方案是更新您的 ECJ 编译器或移至 javac。

关于java - 使用 ECJ 的 Lambda/默认方法/类型删除怪癖/错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31049183/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com