首页 > 解决方案 > 我无法理解没有父母的孩子的投射界面

问题描述

我正在学习 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{

}

标签: javaspring-boothttpcasting

解决方案


假设您使用的是最新的 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类。


推荐阅读