未经检查的调用 setValueFactory(SpinnerValueFactory<T>)

unchecked call to setValueFactory(SpinnerValueFactory<T>)

我正在使用 Java JDK 17,但我收到以下代码段的未检查调用警告:

错误

unchecked call to setValueFactory(SpinnerValueFactory)

代码

import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory;

IntegerSpinnerValueFactory valueFactory;
valueFactory =  new IntegerSpinnerValueFactory(0,100, 0,1);
paramValue.setValueFactory(valueFactory);

我怎样才能摆脱这个警告。

您的问题出在您未提供的代码中,对于此类问题,您应该始终尝试提供 minimal example

我对这个答案(微调器声明)中缺少的代码做了一个假设,希望这是正确的。

通过声明泛型修复警告

您需要在创建微调器时正确声明泛型。

假设您有一个这样定义的工厂:

IntegerSpinnerValueFactory valueFactory =
        new IntegerSpinnerValueFactory(0, 100, 0, 1);

并且您想在 Spinner 中使用它。

如果你在没有泛型的情况下声明微调器,那么你将收到未经检查的调用警告,无论是在你声明还是在你使用微调器时(即这两行都会导致警告):

Spinner uncheckedSpinner = new Spinner();
uncheckedSpinner.setValueFactory(valueFactory);

如果您使用泛型声明微调器,那么您将不会收到任何未经检查的调用警告:

Spinner<Integer> checkedSpinner = new Spinner<>();
checkedSpinner.setValueFactory(valueFactory);

未检查警告的一般情况

有关更多信息,请参阅(请阅读并尝试理解):

  • How to fix unchecked call warning in Java?

这个问题本可以作为链接问题的副本关闭,但我认为最好为您的问题案例提供一个具体的答案。

另请注意,这只是一个编译器警告,代码仍然有效(您丢失了一些类型安全编译时检查,但只要您使用正确的类型进行编码,就不会出现运行时异常).

为了更好地理解泛型,您应该花时间重新访问关于它们的教程:

抑制未经检查的警告

有时,例如如果使用非常旧的库或非常复杂和奇怪的通用库(例如 JavaFX TableView),最好只抑制未经检查的警告,这可以在 Idea 中使用以下方法完成,这可能在其他 IDE 中以其他方式可用:

  • Disable warning in IntelliJ for one line

当然,通常最好通过适当声明您使用的泛型来修复警告的根本原因,但有时如果您确切知道自己在做什么,也可以只抑制它们。

使用微调器构造函数提供值工厂

另请注意,如果您使用适当的微调器构造函数,则无需提供微调器值工厂,因为微调器实现将足够智能,可以选择和创建正确的工厂。所以你可以完全跳过价值工厂的创建,如果你只是写:

Spinner<Integer> checkedSpinner = new Spinner<>(0, 100, 0);

完整示例代码

import javafx.scene.Scene;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory;
import javafx.stage.Stage;

public class SpinnerChecks extends Application {
    @Override
    public void start(Stage stage) {
        IntegerSpinnerValueFactory valueFactory =
                new IntegerSpinnerValueFactory(0, 100, 0, 1);

        Spinner<Integer> checkedSpinner = new Spinner<>();
        checkedSpinner.setValueFactory(valueFactory);

        // both these lines will generate warnings upon compiler (and warning inside smart editors like Idea).
        // the compiler will output warning messages such as the following:
        //   SpinnerChecks.java
        //   java: SpinnerChecks.java uses unchecked or unsafe operations.
        //   SpinnerChecks.java
        //   java: Recompile with -Xlint:unchecked for details.
        Spinner uncheckedSpinner = new Spinner();
        uncheckedSpinner.setValueFactory(valueFactory);

        Spinner<Integer> constructedSpinner = new Spinner<>(0, 100, 0);

        stage.setScene(new Scene(checkedSpinner));
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}