Я изучаю лямбда, а затем класс WebClient, поэтому я создаю bean-компонент WebClient

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);
        };
}); 

Это код HttpMessageReader

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{

}
-4
bittap 9 Апр 2021 в 04:58

1 ответ

Лучший ответ

Предполагая, что вы используете последнюю версию 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 - это родительский интерфейс, LoggingCodecSupport - это дочерний класс, а FormHttpMessageWriter - это класс Bar.

1
albertjtan 9 Апр 2021 в 03:10