所以我有一个接口,它扩展了 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)
为什么铸造不工作的原因是,不管是什么原因,都会导致 BiConsumer.andThen
返回,它没有实现 MyActionWithParameters
. 这到底是怎么一回事?BiConsumer
,一个JDK接口,应该知道自己的自定义接口吗:-)
但是使用方法引用是可行的,因为通过使用方法引用,对象的类型可以是 super.andThen
返回,也就是 newAction
,不再重要。重要的是... 办法 - accept
. 是否 accept
有一个兼容的签名,以满足功能接口的要求。MyActionWithParameters
? 是的,所以它的工作。