java.lang.String 无法转换为 org.slf4j.Marker

java.lang.String cannot be converted to org.slf4j.Marker

我正在使用 import lombok.extern.slf4j.Slf4j; 对于我的 class,这是我的日志语句:log.info("{} : {} - {}", String1, String2, String3);

但它无法编译并抱怨以上行:java.lang.String cannot be converted to org.slf4j.Marker

有什么想法吗?

我猜你愿意使用info(String format, Object... arguments)并且想知道为什么真正调用的方法是info(Marker marker, String format, Object arg1, Object arg2)

这与 Most Specific Method selection and Identify Potentially Applicable Methods 有关。

由于您正好有四个参数,其中三个完全匹配,因此必须将 info(Marker marker, String format, Object arg1, Object arg2) 方法视为 "potentially matching"。

您应该阅读有关可变 arity 参数的文档以获取更多详细信息。

我刚遇到同样的问题。我明白这个问题,谢谢 Kraal,但像下面这样的解决方法会有所帮助。

log.info("{} : {} - {}", 
    new Object[] {String1, String2, String3});

在我的例子中,IntelliJ 错误地选择了 Jar“slf4j-api-1.6.1.jar”,而我期望我的代码使用“slf4j-api-1.7.10.jar".

SLF4J FAQ 中有一个简短的(但有点微妙的)讨论。更改背后的想法是 Log4J 的创建者使 Log4J 使用 Marker 对象而不是 Strings,而早期的 beta 仅使用 Object。似乎他们将其更改为更宽松。接受的答案指出当类路径有错误的 jar 时选择了错误的方法调用。

如果您使用的是 Lombok,它也会变得更加混乱,因为 @Slf4j 注释会干扰此处使用的类型。

从我的类路径中删除 1.6.1 Jar 并放入 1.7.10 Jar 后,编译再次开始工作。