Котлин: неоднозначность разрешения перегрузки - PullRequest
0 голосов
/ 08 ноября 2019

Новое в Котлине. Я использую 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 Ответ

3 голосов
/ 08 ноября 2019

Глядя на документы, я не могу найти первую из этих двух неоднозначных функций. Предполагая, что это происходит из преобразования 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") })
...