Kotlin:过载分辨率的歧义

时间:2019-11-08 14:56:31

标签: kotlin overload-resolution

科特林的新手。我正在使用Apache Camel,并使用process转换器创建了一条路由,如下所示:

from("snmp:blahblah...")
    .routeId("CamelSnmpRoute")
    ...
    .process {                          <<< Here
        logger.debug("Log stuff")
    }

错误:

Overload resolution ambiguity. All these functions match.
* public final fun process(processor: (() -> Processor!)!): RouteDefinition! defined in org.apache.camel.model.RouteDefinition
* public final fun process(processor: ((exchange: Exchange!) -> Unit)!): RouteDefinition! defined in org.apache.camel.model.RouteDefinition

我尝试做.process { () ->,但它不喜欢这样,说它期望在方括号之间有一个名称。同时,我可以使用.process { exchange ->而不是使用exchange var来避免错误,或者创建一个logProcessor var并将其传入:

    .process(logProcessor)
}

private var logProcessor: Processor = Processor {
    logger.debug("Logging stuff")
}

有人可以告诉我如何内联此变量,以免产生歧义或多余的变量吗?

1 个答案:

答案 0 :(得分:3)

看文档,我找不到这两个模棱两可的函数中的第一个。假设它来自SAM转换,则在Java中看起来像是采用某种ProcessorFactory接口的方法,在这种情况下,几乎可以肯定的是,它将内部调用工厂方法并将结果传递给第二个模棱两可的方法。

所以无论哪种方式,exchange变量都会在某个时刻存在。省略它只会将其名称更改为默认的it

如果您不打算使用功能参数,则可以在其名称下使用下划线以提高可读性:

from("snmp:blahblah...")
    .routeId("CamelSnmpRoute")
    ...
    .process { _ -> logger.debug("Log stuff") }

您可以像这样交替表达特定的接口类型:

from("snmp:blahblah...")
    .routeId("CamelSnmpRoute")
    ...
    .process (Processor{ logger.debug("Log stuff") })