未经检查的调用 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();
}
}
我正在使用 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();
}
}