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

时间:2018-10-24 08:39:26

标签: javafx kotlin

我刚开始按照以下教程学习Kotlin和JavaFX。 我可以看到空白的JavaFX窗口,然后使用FXML进行下一步。

import os
os.system("afplay file.mp3") 

但是,我无法弄清楚如何避免类型推断错误,例如:
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

我试图阅读有关JavaFX的文档,但无法弄清楚。(我不熟悉Java和Kotlin) 我尝试键入类似fxml的字词,但这没有任何意义。

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

环境和代码

环境

  • JDK 11
  • JavaFX 11
  • 科特林1.2.71

我的完整试用版代码

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

1 个答案:

答案 0 :(得分:1)

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

public static <T> T load(URL location)

Kotlin编译器需要知道您的root变量是什么类型(因为您没有明确定义它),但是它不知道那是因为代码中没有任何内容可以允许它进行推断这个。

一个快速的Google返回的this示例中包含以下代码(使用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文件中有一个错误,这意味着在我获取代码时,代码没有立即编译:

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