【问题标题】:Why do I get a cast exception in the "for each" and not in the "for"?为什么我在“for each”而不是“for”中得到一个强制转换异常?
【发布时间】:2018-10-04 09:06:53
【问题描述】:

我希望以下代码中的两个 fors 的行为方式相同,但事实并非如此:

ArgumentCaptor<Appender> argumentCaptor = ArgumentCaptor.forClass(Appender.class);
Mockito.verify(mockedAppender, times(3)).doAppend(argumentCaptor.capture());

for(int i = 0; i< argumentCaptor.getAllValues().size(); ++i) {
    System.out.println(((LoggingEvent) argumentCaptor.getAllValues().get(i)).getMessage());
}

for(Appender appender : argumentCaptor.getAllValues()) {
     System.out.println(((LoggingEvent) appender).getMessage());
}

第一个正确打印消息,而第二个给我这个异常:

java.lang.ClassCastException: ch.qos.logback.classic.spi.LoggingEvent 不能强制转换为 ch.qos.logback.core.Appender

【问题讨论】:

  • 你没有把东西投进Appender,所以我猜foreach循环头中的类型是错误的
  • 试试for (LoggingEvent appender : argumentCaptor.getAllValues())
  • 我相信 argumentCaptor.getAllValues().get(i) 返回的对象可以同时转换为 Appender 和 LoggingEvent 但 Appender 不能转换为 LoggingEvent
  • 我认为ArgumentCaptor&lt;Appender&gt; argumentCaptor 在这里是错误的。你实际上捕获了LoggingEvents,所以它应该是ArgumentCaptor&lt;LoggingEvent&gt;
  • 嗯,它还能编译吗?

标签: java for-loop foreach casting


【解决方案1】:

问题不在于打印函数内部的转换。

我认为问题出在:

for(Appender appender : argumentCaptor.getAllValues()) { ...

改成

for(LoggingEvent loggingEvent : argumentCaptor.getAllValues()) {
     System.out.println(loggingEvent.getMessage());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多