【发布时间】:2018-04-01 19:03:20
【问题描述】:
我只想从使用 Log4j (v2.8.2) 的 Java 移植以下代码:
ConsoleAppender appender = ConsoleAppender.newBuilder().
withName("ConsoleAppender").build();
问题在于 newBuilder() 方法,它在 log4j 中被定义为某种递归泛型:
@PluginBuilderFactory
public static <B extends Builder<B>> B newBuilder() {
return new Builder<B>().asBuilder();
}
Java 代码会自动推断泛型参数,而 Kotlin 则不然。在 Kotlin 中调用这个方法有什么解决方案吗?
我在 Kotlin 中尝试过的代码:
val appender = ConsoleAppender.newBuilder().withName("ConsoleAppender").build()
出现以下错误:
Error:(90, 48) Kotlin: Type inference failed: Not enough information to infer parameter B in fun !> newBuilder(): B!请明确说明。
当代码在粘贴时自动从 Java 转换时,它会设置一些存根 newBuilder<B>(),其中 B 未定义,我不知道它应该是什么。
【问题讨论】:
-
能否包含您尝试过的代码和收到的错误消息
-
在您尝试的行中,我看不出编译器应该如何推断类型。在 Java 示例中,您显式声明了类型,但在 Kotlin 中没有。
-
您是否尝试过明确指定附加程序类型?喜欢:
val appender : ConsoleAppender = ... -
是的,现在试了,同样的错误。