Попробовав Kotlin lang, у меня сложилось впечатление, что он совместим с Java и, следовательно, с JavaFX, и я пробовал:
public object TestKt: Application() { public override fun start(stage: Stage){ val pane= Pane() val scene=Scene(pane,200.0,200.0) stage.scene = scene stage.show() } @JvmStatic public fun main(args: Array<String>){ launch() } }
это в основном то же самое, что и Java
public class Test extends Application { @Override public void start(Stage stage) { Pane pane=new Pane(); Scene scene=new Scene(pane, 200,200); stage.setScene(scene); stage.show(); } public static void main(String[] args){ launch(); } }
но Kotlin дает сообщение об ошибке: Исключение в потоке "main" java.lang.RuntimeException: Невозможно построить экземпляр приложения: class Test
Выбранные вами образцы кода не эквивалентны: объявление object
в Kotlin является одноэлементным, поэтому он имеет только один экземпляр, созданный вызовом частного конструктора при инициализации класса. JavaFX пытается вызвать конструктор класса рефлексивно, но не работает, потому что конструктор является закрытым, как и должно быть.
Вместо этого вы можете найти простое объявление класса, с main
в его сопутствующем объекте . Если явные конструкторы не объявлены, Kotlin, как и Java, будет генерировать значение по умолчанию, позволяя JavaFX создавать экземпляр приложения:
class Test : Application() { override fun start(stage: Stage) { ... } companion object { @JvmStatic fun main(args: Array<String>) { launch(Test::class.java) } } }
class MyApplication : Application() { override fun start(primaryStage: Stage) { } } fun main(args: Array<String>) { Application.launch(MyApplication::class.java, *args) }