#kotlin
#kotlin
Вопрос:
Я определил main (args: Array) в двух файлах Kotlin в одном пакете. Компилятор не жалуется. Почему нет? Я использую IntelliJ IDEA с Gradle
#file1.kt
package test
fun main(args: Array<String>) {}
#file2.kt
package test
fun main(args: Array<String>) {}
Комментарии:
1. Почему он должен жаловаться? Это две отдельные точки входа… если вы хотите запустить программу, вам нужно точно знать, какую из них вы хотите использовать.
2. @Moira Предположим, вы хотите вызвать один из них из класса в другом пакете, как бы вы импортировали его и убедились, что вы не импортируете другой? Другие функции, отличные от main, вызывают ошибку неоднозначности.
3. @Moira Можем ли мы определить main() в этих 2 файлах? Ответ — нет.
4. эта основная функция также не разрешена. fun main(аргументы: Массив<Строка>) = runBlocking { запуск { println(«main») } }
5. Не предполагается, что он жалуется, когда у вас есть это в двух разных файлах. Вы можете сделать то же самое с Java, потому что функция main всегда указывает на класс Java, не на пакет. Код компилируется в
file[num]Kt.java
, что означает два отдельных класса. Это разработано специально и также допустимо в Java
Ответ №1:
Стал бы компилятор жаловаться, если бы это была Java? Нет. Поскольку метод main является точкой входа в ваше приложение, проблема может возникнуть только при наличии неоднозначности в приложении, которое вы пытаетесь создать. В своем вопросе вы не указали никаких подробностей о своем приложении. Эти два файла могут совершенно не знать друг о друге, чего бы это ни стоило.
Это может быть проблемой при запуске, но даже это редко случается в наши дни. Современные фреймворки, такие как Spring Boot, имеют свой собственный способ определить, где запускать ваше приложение, то есть где находится точка входа. Они используют свои специфические файлы МАНИФЕСТА и загрузчики контекста / классов и структуры проекта.
Комментарии:
1. В Java все по-другому. Метод main в Java определяется внутри класса. Здесь, в Kotlin, функция main имеет верхний уровень. Также я упоминаю, что эти 2 файла находятся в одном пакете. Даже если разработчики могут не знать об этом, компилятор будет. Попробуйте определить main() в обоих файлах, чтобы посмотреть, что произойдет.
2. Я пытался добавить файл рядом с моим основным файлом приложения, и он по-прежнему компилируется и работает без проблем. Вероятно, вам следует предоставить больше контекста. Все компилируется вплоть до классов Java, единственное отличие от Kotlin заключается в том, что классы будут иметь «Kt» в конце.
3. вы пробовали main () в двух файлах? Я имею в виду main(), а не main (аргументы: Массив<строка>)
4. А, понял твою точку зрения. Но все равно, проблемы возникают только тогда, когда я пытаюсь собрать исполняемый файл Spring Boot, вызвав bootRun или bootJar. Если я только запускаю gradle compileKotlin, все в порядке. Итак, мы возвращаемся к вопросам «Почему компилятор Kotlin должен беспокоиться?»