java - 我无法理解没有父母的孩子的投射界面
问题描述
我正在学习 lambda,然后是 WebClient 类,所以我正在创建 WebClient 的 bean
ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder().build();
exchangeStrategies.messageWriters()
.stream()
.filter(LoggingCodecSupport.class::isInstance)
.forEach(writer -> ((LoggingCodecSupport)writer).setEnableLoggingRequestDetails(true));
我认为顶部代码和底部代码是相同的
ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder().build();
exchangeStrategies.messageWriters()
.stream()
.filter(new Predicate<HttpMessageWriter>() {
public boolean test(HttpMessageWriter t) {
return LoggingCodecSupport.class.isInstance(t);
};
})
.forEach(new Consumer<HttpMessageWriter>() {
public void accept(HttpMessageWriter t) {
((LoggingCodecSupport)t).setEnableLoggingRequestDetails(true);
};
});
我不明白这种转换情况,因为 HttpMessageWriter 是接口并且 LoggingCodecSupport 是类但 LoggingCodecSupport 没有实现 HttpMessageWriter,所以我认为 HttpMessageWriter 不能转换为 LoggingCodecSupport
.forEach(new Consumer<HttpMessageWriter>() {
public void accept(HttpMessageWriter t) {
((LoggingCodecSupport)t).setEnableLoggingRequestDetails(true);
};
});
这是 HttpMessageWriter 的代码
public interface HttpMessageWriter<T> {
....
}
这是 LoggingCodecSupport 的代码
public class LoggingCodecSupport {
....
}
我试图测试这种情况,但它使 java.lang.ClassCastException
public class Test4 {
public static void main(String[] args) {
Parent parent = new Parent() {};
((Child)parent).foo();
}
}
class Child{
public void foo() {
System.out.println("foo");
}
}
interface Parent{
}
帮助我理解这件事
并制作此代码,但它也会产生 java.lang.ClassCastException
public class Test4 {
public static void main(String[] args) {
Parent parent = new Parent() {};
((Child)parent).foo();
}
}
class Child{
public void foo() {
System.out.println("foo");
}
}
interface Parent{
}
class bar extends Child implements Parent{
}
解决方案
假设您使用的是最新的 Spring,这是因为 LoggingCodecSupport 的子类之一实现了 HttpMessageWriter 接口。
你可以看看这个类FormHttpMessageWriter
它扩展了 LoggingCodecSupport 但实现了一个 HttpMessageWriter 接口。这就是为什么它可以在不抛出异常的情况下进行转换。
例子应该是这样的
public class Test4 {
public static void main(String[] args) {
Parent bar = new Bar() {};
((Child)bar).foo();
}
}
class Child {
public void foo() {
System.out.println("foo");
}
}
interface Parent {
}
class Bar extends Child implements Parent {
}
我们可以假设HttpMessageWriter是Parent接口,LoggingCodecSupport是Child类,FormHttpMessageWriter是Bar类。
推荐阅读
- rust - 如何在安全的 Rust 中为未调整大小的类型及其拥有的对应对象(如 `str` 和 `String`)创建新类型?
- python - 如何使用python将文件夹及其子文件夹和文件上传到谷歌驱动器文件夹中
- spring-boot - 在 oauth2 资源服务器中检索用户信息
- c++ - 如何通过取 n 行/列然后跳过 m 行/列来对 Eigen 中的矩阵进行切片
- python - 非凸函数优化
- python - 如果用户输入等于键,则获取字典值
- asp.net-core - SignalR OnConnected 找不到合适的方法来覆盖?
- html - 如何将不断增长的文本区域内联与按钮对齐
- python - 在动词或单词之后查找名词的下一个出现
- c++ - 当自动变量的析构函数调用修改函数返回值时,MSVC14.1 和 gcc8.3 之间观察到的差异