为什么我不能直接转换 super 调用的结果?

Why can't I cast the result of the super call directly?

所以我有一个扩展 BiConsumer.

的接口
@FunctionalInterface
public interface MyActionWithParameters<E, P> extends BiConsumer<Selection<E>, P> {
    @Override
    default MyActionWithParameters<E, P> andThen(BiConsumer<? super Selection<E>, ? super P> after) {
        var newAction = BiConsumer.super.andThen(after);
        return newAction::accept;
    }
}

这有效。

但是如果我尝试 return (MyActionWithParameters<>) BiConsumer.super.andThen(after);,我会得到一个 class 转换异常。

这是为什么?为什么我可以投射 newAction::accept(即新的 BiConsumer)而不是 BiConsumer 本身?我觉得答案应该很明显,但我就是看不到。

编辑:完全错误

Caused by: java.lang.ClassCastException: class java.util.function.BiConsumer$$Lambda65/0x0000000840d10840 cannot be cast to class blah.blah.blah.MyFoo$MyActionWithParameters (java.util.function.BiConsumer$$Lambda65/0x0000000840d10840 is in module java.base of loader 'bootstrap'; blah.blah.blah.MyFoo$MyActionWithParameters is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @739fc679)

转换不起作用的原因是因为无论 BiConsumer.andThen returns,它没有实现 MyActionWithParametersBiConsumer,一个JDK界面,怎么会知道自己的自定义界面? :-)

但是使用方法引用是可行的,因为通过使用方法引用,super.andThen returns 又名 newAction 的对象类型不再重要。重要的是 方法 - acceptaccept是否有兼容的签名来满足MyActionWithParameters的功能接口?是的,它确实有效。