2016-04-18 36 views
1

我正在学习JavaFX,专门试图使用TableColumn和TableView类实现一个表。我的程序编译没有错误,但我得到一个不祥的前瞻性,在编译时警告:JavaFX编译警告 - “使用未经检查或不安全的操作” - 原始数据类型?

C:\JavaFX_Sandbox>javac robotApp.java 
Note: robotApp.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 

C:\JavaFX_Sandbox> 

这充分weirded我出去,以至于我没有胆量尝试实际运行我的程序。我在StackOverflow和其他一些网站上做了一些挖掘,发现这个警告最可能的原因是我使用的是原始数据类型。但如果是这样,我无法发现它们。如果不是,我担心这个消息可能意味着什么。

要尽可能快地描述我的计划:我创建了一个书呆子robot.java类:

public class robot{ 

    private String name; 
    private int intelligence; 

    public robot(String a, int b){ 
     this.name = a; 
     this.intelligence = b; 
    } 
} 

没什么特别的。要保存所有这些机器人,我创建了一个robotMgr.java类,基本上是一个华而不实的ArrayList中保存所有:

import java.util.ArrayList; 
import java.util.List; 
import javafx.collections.*; 

public class robotMgr{ 

    private ArrayList<robot> robotList; 
    private ObservableList<robot> oRobotList; 

    robotMgr(){ 
     robotList = new ArrayList<robot>(); 
     robotList.add(new robot("R2-D2", 7)); 
     robotList.add(new robot("Cylon", 3)); 
     robotList.add(new robot("The Terminator", 5)); 
     robotList.add(new robot("WALL-E", 6)); 
     populateOList(); 
    } 
    public void populateOList(){ 
     for(int i=0; i<robotList.size(); i++) 
      oRobotList.add(robotList.get(i)); 
    } 

    public List<robot> getRobotList(){ 
     return robotList; 
    } 
    public ObservableList<robot> getORobotList(){ 
     return oRobotList; 
    } 
} 

(我在ArrayList中更多的数据操作,但ObservableList是必要的,因为的TableColumn类预期必须从ObservableList馈送的表元素)

现在的主要事件:A JavaFX的程序,其采用上述的数据并将其显示在一个简单的,两列的表:

import javafx.application.*; 
import javafx.stage.*; 
import javafx.scene.*; 
import javafx.scene.layout.*; 
import javafx.scene.control.*; 
import javafx.scene.control.cell.*; 
import javafx.event.*; 
import javafx.geometry.*; 
import javafx.collections.*; 

public class robotApp extends Application{ 

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

    TableColumn<robot, String> colName; 
    TableColumn<robot, Integer> colIntelligenge; 
    TableView<robot> robotTable; 

    BorderPane borderPane; 
    Scene scene; 
    Stage stage; 

    @Override public void start(Stage primaryStage){ 

     robotMgr myBots = new robotMgr(); 

     colName = new TableColumn<robot, String>("Name"); 
     colName.setMinWidth(100); 
     colName.setCellValueFactory(new PropertyValueFactory<robot, String>("Name")); 
     colIntelligenge = new TableColumn<robot, Integer>("Intelligence"); 
     colIntelligenge.setMinWidth(100); 
     colIntelligenge.setCellValueFactory(new PropertyValueFactory<robot, Integer>("Intelligence")); 

     robotTable = new TableView<robot>(); 
     robotTable.getColumns().addAll(colName, colIntelligenge); 
     robotTable.setItems(myBots.getORobotList()); 

     borderPane = new BorderPane(); 
     borderPane.setCenter(robotTable); 
     scene = new Scene(borderPane, 600, 600); 
     stage = primaryStage; 
     stage.setScene(scene); 
     stage.setTitle("Robot App"); 
     stage.show(); 

    } 
} 

所有外表对我好。除了上面提到的警告信息外,一切都编译好。奇怪的是,如果我注释掉“robotTable.getColumns()。addAll(colName,colIntelligenge);”只有线。

所以......我完全感到困惑。如果错误消息警告我使用原始数据类型,我不知道它们在我的程序中。如果错误信息警告其他事情,我不知道可能是什么。另外:为什么addAll()方法是导致警告的行?我无法为我的生活找到那一个。

机器人的实例变量是否都是私有的问题?如果是这样,它不会在编译时创建特定的语法错误吗?或者是ObservableList的问题?理解OL是接口,而不是数据结构......但我不明白这怎么能让我在这里绊倒。

如果有人可以提供一些帮助或建议,我会非常感激。

非常感谢! -RAO

+3

因此,您是否尝试使用'-Xlint:unchecked'编译为编译器警告所说的? –

+1

(我会*强烈*敦促你开始遵循Java命名约定,顺便说一句 - 你的类应该被称为'Robot','RobotManager'和'RobotApp'。) –

+1

[Java命名约定]的链接(https:// en .wikipedia.org/wiki/Naming_convention_(编程)#Java) –

回答

4

你的代码是完全安全的运行(它有错误,当你运行它时会发现,但是这些错误与你所要求的类型安全无关)。

基本上,问题是您调用的addAll()方法需要一个“varargs”参数,其类型是泛型类型。对于TableView<S>TableView.getColumns()返回ObservableList<TableColumn<S,?>>ObservableList<E>addAll()您正在调用的方法采用可变参数:addAll(E... elements)。所以你最终调用一个签名为addAll(TableColumn<Robot, ?>... columns)的方法。

可变参数通过将它们转换为数组进行处理,所以当您调用addAll方法时,您隐式创建了一个类型为TableColumn<Robot, ?>[]的数组。由于数组和参数化类型在一起播放不好,编译器无法确保此数组的类型安全。因此,它发出警告。参见例如here举例说明为什么编译器不能确保类型安全。

addAll()方法的作者可能应该对它进行编码,以确保类型安全并对其进行注释,以避免此警告(如果可能的话:我需要考虑更多的时间比我有权利现在)。

为了避免该警告,你可以简单地调用add方法两次:

robotTable.getColumns().add(colName); 
robotTable.getColumns().add(colIntelligenge); 

另外,您可以创建表列的List并传递到(其他)addAll(...)方法,它需要一个集合,而不是可变参数参数:

robotTable.getColumns().addAll(Arrays.asList(colName, colIntelligence)); 
+0

哇 - 谢谢你,我有很多细节可以挖掘 - 更重要的是,请仔细阅读!这非常有帮助,你不知道。 :) – Pete

+0

如果你想完全理解泛型,我推荐Naftalin和Wadler的“Java泛型和集合”。 –

相关问题