簡體   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