我只想从使用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()
它有以下错误:
错误:(90,48)Kotlin:类型推断失败:没有足够的信息来推断参数B的乐趣!> newBuilder():B!请明确说明 .
当代码在粘贴时自动从Java转换时,它会设置一些stub newBuilder<B>()
,其中B未定义,我不知道它应该是什么 .
2 回答
Log4J似乎使用了一个构建器模式,在Kotlin中要求每个开放的非抽象类都有两个构建器:一个是泛型的,可以通过子类扩展,另一个是非泛型的,可以实例化 .
既然你可能不想修改Log4J,我会考虑使用反射:
}
请在discuss.kotlinlang.org查看我的回答:
Recursive generic in Builder pattern
我找到了等待如何为log4j2配置解决此问题,请参阅示例: