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

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. Заранее спасибо.

1
José-Alberto Gilberte León 23 Окт 2018 в 13:11

2 ответа

Лучший ответ

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

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

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

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

factory.addConnectorCustomizers(TomcatConnectorCustomizer { it.addUpgradeProtocol(Http2Protocol()) })
0
tynn 23 Окт 2018 в 10:59

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

Джава:

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

Котлин :

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

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

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

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

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

0
Marko Topolnik 23 Окт 2018 в 12:08
52946487