почему main (args: Array) разрешено определять более чем в одном файле

#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 должен беспокоиться?»