为什么我不能直接转换 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,它没有实现 MyActionWithParameters
。 BiConsumer
,一个JDK界面,怎么会知道自己的自定义界面? :-)
但是使用方法引用是可行的,因为通过使用方法引用,super.andThen
returns 又名 newAction
的对象类型不再重要。重要的是 方法 - accept
。 accept
是否有兼容的签名来满足MyActionWithParameters
的功能接口?是的,它确实有效。
所以我有一个扩展 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,它没有实现 MyActionWithParameters
。 BiConsumer
,一个JDK界面,怎么会知道自己的自定义界面? :-)
但是使用方法引用是可行的,因为通过使用方法引用,super.andThen
returns 又名 newAction
的对象类型不再重要。重要的是 方法 - accept
。 accept
是否有兼容的签名来满足MyActionWithParameters
的功能接口?是的,它确实有效。