Преобразование лямбда-Java в Kotlin Lamba с IntelliJ сгенерировать синтаксическую ошибку - PullRequest
0 голосов
/ 23 октября 2018

У меня есть класс Java, который настраивает встроенный том Spring Boot 2.0.6 для использования протокола HTTP2:

package com.oesia.mako.config;

import org.apache.catalina.connector.Connector;
import org.apache.coyote.http2.Http2Protocol;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TomcatHttp2Config {
    @Bean
    public ConfigurableServletWebServerFactory tomcatCustomizer() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((Connector connector) -> {
            connector.addUpgradeProtocol(new Http2Protocol());
        });
        return factory;
    }
}

Когда я использую IntelliJ для преобразования этого фрагмента кода в Kotlin, я получаю ошибку компиляции.Вот код Kotlin, который IntelliJ возвращает:

package com.oesia.mako.config

import org.apache.catalina.connector.Connector
import org.apache.coyote.http2.Http2Protocol
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class TomcatHttp2Config {
    @Bean
    fun tomcatCustomizer(): ConfigurableServletWebServerFactory {
        val factory = TomcatServletWebServerFactory()
        factory.addConnectorCustomizers({ connector: Connector -> connector.addUpgradeProtocol(Http2Protocol()) })
        return factory
    }
}

Я получаю эту ошибку:

Type mismatch.
Required:
TomcatConnectorCustomizer!
Found:
(Connector) → Unit

В строке, которая появляется лямбда:

    factory.addConnectorCustomizers({ connector: Connector -> connector.addUpgradeProtocol(Http2Protocol()) })

Как яможно перевести код Java выше на Kotlin.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Это вероятная ошибка компилятора Kotlin, которая проявляется, когда функциональным аргументом является vararg.Вот минимальный воспроизводитель:

Java:

public class Runner {
    void addTasks(Runnable... tasks) { }
}

Kotlin:

fun main(args: Array<String>) {
    Runner().addTasks({ println("success") })
}

Ошибка: (4, 26) Kotlin: Несоответствие типов: предполагаемый типis () -> Модуль, но работоспособный!ожидалось

Если мы изменим Java:

public class Runner {
    void addTask(Runnable task) { }
}

ошибка исчезнет.

0 голосов
/ 23 октября 2018

Вы можете посмотреть SAM преобразований для Kotlin .

Если по какой-то причине версия с методом не работает

factory.addConnectorCustomizers { it.addUpgradeProtocol(Http2Protocol()) }

Вы можете легко реализовать интерфейс Java как

factory.addConnectorCustomizers(TomcatConnectorCustomizer { it.addUpgradeProtocol(Http2Protocol()) })
...