kotlin springboot application – почему нет функции с выражением тела?

В моем загрузочном приложении kotlin-spring (2.0.0.M6) все работает нормально, когда я это делаю

fun main(args: Array<String>) { runApplication<MyApplication>(*args) } 

но mainClass не может быть найден, и IDEA не разрешает запуск приложения, когда я это делаю

 fun main(args: Array<String>) = runApplication<RankedApplication>(*args) 

это не критично, но мне интересно: почему?

runApplication не возвращает Unit .

Тип подписи и возврата main должен быть точно:

 fun main(Array<String>): Unit 

runApplication , однако, возвращает ConfigurableApplicationContext .

Ваш «основной» метод эквивалентен:

 fun main(args: Array<String>): ConfigurableApplicationContext { return runApplication<MyApplication>(*args) } 

так как тип возврата выводится из выражения – и вы можете видеть, что это не допустимая точка входа.

Ваш первый метод работает, потому что

 fun main(args: Array<String>) { runApplication<MyApplication>(*args) } 

такой же как

 fun main(args: Array<String>): Unit { runApplication<MyApplication>(*args) return Unit } 

поскольку Unit (объект singleton) является типом возвращаемого по умолчанию, когда ни один не указан, и неявно возвращается в конце метода, объявленного для возврата Unit .

Это также означает, что return без аргумента действителен – он просто возвращает Unit .


Если бы вы захотели, вы могли бы сделать способ конвертировать вещи в Unit хотя это, вероятно, слишком велико.

 inline fun Unit(lambda: () -> Any?) { lambda() } ... fun main(args: Array<String>) = Unit { runApplication<MyApplication>(*args) } 

Это то же самое в Java , что, скорее всего, связано с этим требованием – сигнатура основного метода должна быть public static void main(String[]) .

 fun main(args: Array<String>) { runApplication<MyApplication>(*args) } 

main возвращает Unit здесь неявно, что правильно.

Вот

 fun main(args: Array<String>) = runApplication<RankedApplication>(*args) 

тип возвращаемого значения выводится из данного выражения в нечто иное, чем Unit (поскольку runApplication возвращает что-то), что не работает, потому что основная функция должна возвращать Unit .