I'm getting this strange exception in code run using jre1.8.0_66:
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
What's it mean? The code is as follows:
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);
}
The exception goes away if I change Fruit::getPickingMonth to x -> x.getPickingMonth().
For what it's worth: The exception also goes away if I remove Serializable from either class.  But returns if I add another, equivalent interface to both classes, e.g. Cloneable or some custom interface.
 
     
     
     
    