Не могу определить правильный тип себя в Kotlin при использовании JavaFX - PullRequest
0 голосов
/ 24 октября 2018

Я только начал изучать Kotlin и JavaFX, следуя инструкции.Я мог видеть пустые окна JavaFX, и я перешел к следующему шагу с использованием FXML.

import javafx.application.Application
import javafx.fxml.FXMLLoader
import javafx.scene.Scene
import javafx.stage.Stage

class AppMain : Application() {

    override fun start(primaryStage: Stage) {
        primaryStage.title = "Try JavaFX"
        val fxml = javaClass.getResource("fxml/Main.fxml")
        val root = FXMLLoader.load(fxml) // ERRORS here! `load`
        val scene = Scene(root)

        primaryStage.scene = scene

        primaryStage.show()
    }

}

Однако я не мог понять, как избежать ошибки вывода типа, такой как:
Error:(12, 31) Kotlin: Type inference failed: Not enough information to infer parameter T in fun <T : Any!> load(p0: URL!): T! Please specify it explicitly.

Из сообщения я понимаю, что должен явно указать тип переменной fxml.Но я понятия не имею, какой тип должен быть помечен как fxml.

Я пытался прочитать документ о JavaFX, но не мог понять это (я не знаком с Java и Kotlin) Я пытался печатать как URL, но это не имеет смысла.

Многие примеры кода JavaFX и Kotlin, которые я смог найти в Google, похоже, не имеют такой проблемы.(Примеры кода написаны в предыдущей версии?) Какой тип я должен указать для переменной?Или я что-то пропустил?

Среда и коды

Среда

  • JDK 11
  • JavaFX 11
  • Kotlin 1.2.71

Мой полный пробный код

https://github.com/QuietJoon/StudyKotlin-JavaFX/tree/fxml

1 Ответ

0 голосов
/ 25 октября 2018

Проблема не в параметре функции FXMLLoader.load (который является java.net.URL объектом, возвращаемым javaClass.getResource).Дело в том, что эта функция возвращает универсальный тип:

public static <T> T load(URL location)

Компилятору Kotlin необходимо знать, каким будет тип вашей переменной root (поскольку выне определено явно), но он не может знать, так как в коде нет ничего, что позволило бы ему сделать вывод об этом.

Быстрый Google вернул этот пример, в котором этот код находится вit (в Java):

Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml"));

Как вы можете видеть здесь, переменная root имеет тип Parent.Так что вам нужно каким-то образом предоставить этот тип (то есть то, что вы ожидаете от функции load).Вот два разных способа сделать это:

  1. Укажите тип явно при объявлении переменной: val root: Parent = FXMLLoader.load(fxml)
  2. Укажите универсальный тип при вызове метода: val root = FXMLLoader.load<Parent>(fxml)

Обратите внимание также, что в вашем файле build.gradle в вашем репозитории github есть ошибка, которая означает, что код не компилируется сразу, когда я его получил:

compile "org.openjfx.javafx.fxml:11:$platform" должно быть compile "org.openjfx:javafx-fxml:11:$platform" (одна из точек должна быть двоеточием).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...