sto ricevendo questa strana eccezione nel codice eseguito utilizzando jre1.8.0_66:eccezione strano "non valido di classe tipo di ricevitore java.lang.Object, non un sottotipo di ..."
Exception in thread "main" java.lang.BootstrapMethodError: call site initialization exception
at java.lang.invoke.CallSite.makeSite(CallSite.java:341)
at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307)
at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:297)
at main
Caused by: java.lang.invoke.LambdaConversionException: Invalid receiver type class java.lang.Object; not a subtype of implementation type interface Fruit
at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:233)
at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:303)
at java.lang.invoke.CallSite.makeSite(CallSite.java:302)
... 3 more
Che significa ? Il codice è il seguente:
public static interface Fruit {
int getPickingMonth();
}
public static class Apple implements Fruit, Serializable {
@Override
public int getPickingMonth() {
return 11;
}
}
public static class Orange implements Fruit, Serializable {
@Override
public int getPickingMonth() {
return 2;
}
}
public static void main(String[] args) {
List<Apple> apples = Arrays.asList(new Apple());
List<Orange> oranges = Arrays.asList(new Orange());
Stream.of(apples.stream(), oranges.stream())
.flatMap(Function.identity())
.map(Fruit::getPickingMonth) // exception occurs on this line
.forEachOrdered(System.out::println);
}
L'eccezione va via se cambio Fruit::getPickingMonth
a x -> x.getPickingMonth()
.
Per quello che vale: Anche l'eccezione scompare se rimuovo Serializable
da una classe. Ma restituisce se aggiungo un'altra interfaccia equivalente a entrambe le classi, ad es. Cloneable
o qualche interfaccia personalizzata.
Questo sembra molto correlato a [questo post] (http://stackoverflow.com/q/33925551/1743880) che è un bug 'javac'. – Tunaki