Я изучаю весенний ботинок и новичок в kotlin. Сообщается об ошибке, когда эта функция Java преобразуется в код kotlin. Как переписать эту функцию kotlin?
https://spring.io/guides/gs/consuming-rest/
@Bean public CommandLineRunner run(RestTemplate restTemplate) throws Exception { return args -> { Quote quote = restTemplate.getForObject( "http://gturnquist-quoters.cfapps.io/api/random", Quote.class); log.info(quote.toString()); }; }
После преобразования этого кода в kotlin по идее:
@Bean @Throws(Exception::class) fun run(restTemplate: RestTemplate): CommandLineRunner { return { args -> val quote = restTemplate.getForObject( "http://gturnquist-quoters.cfapps.io/api/random", Quote::class.java) log.info(quote.toString()) } }
Скажите, пожалуйста, как исправить этот код.
Функция literal / lambda не совсем корректна. Чтобы заставить компилятор преобразовать его в реальную реализацию интерфейса Java CommandLineRunner
, используйте SAM Conversion .
Затем он выглядит следующим образом:
fun run(restTemplate: RestTemplate): CommandLineRunner { return CommandLineRunner { args -> TODO("not implemented") } }
Обратите внимание на CommandLineRunner { args ->...}
В качестве альтернативы, без преобразования SAM, синтаксис object
удобен:
return object : CommandLineRunner { override fun run(vararg args: String?) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } }
Вот пример базового преобразования kotlin преобразования стандартного интерфейса Java в kotlin
// java interface CommandLineRunner { public void run(String... args); } // kotlin fun foo(): CommandLineRunner { return object: CommandLineRunner { override fun run(args: Array<String>) { // TODO } } }
если это функциональный интерфейс, вы можете использовать преобразование SAM
// java @FunctionalInterface interface CommandLineRunner { public void run(String... args); } // kotlin fun foo(): CommandLineRunner { return CommandLineRunner { args -> } }
Надеюсь, вы сможете лучше понять java для преобразования kotlin.