Kam heute darüber hinweg und verbrachte Ewigkeiten damit, zu reproduzieren/herauszufinden, was vor sich ging. Kann jemand erklären, warum das passiert oder ist das ein Bug mit type radition/default methods/lambda's/polymorphism? die Standardmethode uncommenting macht es gut laufen, aber ich würde dies alsLambda/Standard-Methoden/Typ löschen Quirk/Bug mit ECJ?
istOutput arbeiten zu erwarten:
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)
-Code
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 {
}
}
Der mitgelieferte Code funktioniert gut für mich. Ich kompilierte mit javac 1.8.0.25, 1.8.0.40 und ecj, gestartet mit Java 1.8.0.25 und 1.8.0.40. In all diesen Fällen sehe ich keine Ausnahme. Welche Compiler-Version verwendest du? Wahrscheinlich würde das Reinigen des Projekts helfen? –
Sicherlich ein Compiler Bug. Das wird besonders offensichtlich, wenn Sie sagen, dass das Auskommentieren der 'default'-Methode das Problem behebt - da der Compiler * diese' default'-Methode ablehnen sollte, da sie mit der Löschung der anderen 'accept'-Methode kollidiert (und der Bridge-Methode des Compilers) sollte generieren). Aktualisieren Sie Ihren Compiler ... – Holger
Hm Ich habe kompiliert und lief mit .25, .45 und .60ea b19, sie alle für mich gescheitert. Wird unter Windows x64 ausgeführt. –