繁体   English   中英

使用JavaFX时无法在Kotlin中自己推断正确的类型

[英]Can't infer proper type myself in Kotlin when using JavaFX

我通过以下教程开始学习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但这没有任何意义。

我可以从Google找到的许多JavaFX&Kotlin示例代码似乎没有这样的问题。 (示例代码是在以前的版本中编写的吗?)我应该为变量添加哪种类型? 还是我想念其他东西?

环境与规范

环境

  • JDK 11
  • JavaFX 11
  • 科特林1.2.71

我完整的试用代码

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

问题不是FXMLLoader.load函数的参数(这是一个java.net.URL对象,由javaClass.getResource返回)。 就是这个函数返回一个泛型类型:

public static <T> T load(URL location)

Kotlin编译器需要知道您的root变量将是哪种类型(因为您尚未显式定义它),但是它不能知道,因为代码中没有任何内容可以推断出它。

快速的Google返回了示例,其中包含以下代码(使用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)

还要注意,在github build.gradle中的build.gradle文件中,有一个错误,这意味着在我获取代码时,代码没有立即编译:

compile "org.openjfx.javafx.fxml:11:$platform"compile "org.openjfx:javafx-fxml:11:$platform" (点之一应为冒号)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM