为什么我不能直接投出超级调用的结果?

问题描述 投票:3回答:1

所以我有一个接口,它扩展了 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);我得到一个类投异常。

为什么会这样?为什么我可以投 newAction::accept (即一个新的 BiConsumer),但不是 BiConsumer 本身?我感觉答案应该很明显,但我就是没看出来。

编辑:完整的错误

Caused by: java.lang.ClassCastException: class java.util.function.BiConsumer$$Lambda$2165/0x0000000840d10840 cannot be cast to class blah.blah.blah.MyFoo$MyActionWithParameters (java.util.function.BiConsumer$$Lambda$2165/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)
java generics inheritance functional-interface
1个回答
4
投票

为什么铸造不工作的原因是,不管是什么原因,都会导致 BiConsumer.andThen 返回,它没有实现 MyActionWithParameters. 这到底是怎么一回事?BiConsumer,一个JDK接口,应该知道自己的自定义接口吗:-)

但是使用方法引用是可行的,因为通过使用方法引用,对象的类型可以是 super.andThen 返回,也就是 newAction,不再重要。重要的是... 办法 - accept. 是否 accept 有一个兼容的签名,以满足功能接口的要求。MyActionWithParameters? 是的,所以它的工作。

© www.soinside.com 2019 - 2024. All rights reserved.