2016-04-18 4 views
1

Ich lerne JavaFX und versuche speziell, eine Tabelle mit den Klassen TableColumn und TableView zu implementieren. Mein Programm kompiliert ohne Fehler, aber ich habe eine ominöse schau bei der Kompilierung Warnung:JavaFX-Kompilierungswarnung - "verwendet ungeprüfte oder unsichere Operationen" - Rohdatentypen?

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

C:\JavaFX_Sandbox> 

Das ist mir ausreichend aus weirded genug, dass ich nicht den Nerv hatte, um zu versuchen, mein Programm tatsächlich ausgeführt wird. Ich habe hier auf StackOverflow und einigen anderen Sites gegraben und festgestellt, dass die Ursache dieser Warnung am ehesten darin liegt, dass ich Rohdatentypen verwende. Aber wenn, dann kann ich sie nicht erkennen. Und wenn nicht, mache ich mir Sorgen, was diese Nachricht bedeuten könnte.

Um mein Programm so schnell wie möglich zu beschreiben: Ich habe eine nerdy robot.java Klasse erstellt:

public class robot{ 

    private String name; 
    private int intelligence; 

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

Nichts Besonderes. So speichern Sie all diese Roboter, habe ich eine robotMgr.java Klasse, im wesentlichen eine glorifizierte Arraylist zu halten, um sie alle:

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; 
    } 
} 

(I in der Arraylist mehr Datenmanipulation zu tun, aber der ObservableList ist notwendig, weil die Table Klasse erwartet zugeführt wird, die Tabellenelemente aus einem ObservableList)

Jetzt für den Main Event: a. JavaFX-Programm, das die Daten über und zeigt sie in einer einfachen, zweispaltige Tabelle nimmt:

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(); 

    } 
} 

Alle Blicke Gut für mich. Und alles ist in Ordnung, abgesehen von den oben erwähnten Warnmeldungen. Das Seltsame ist, dass die Nachricht verschwindet, wenn ich die "robotTable.getColumns(). AddAll (colName, colIntelligenge)" auskommentiere; " nur Linie.

Also ... ich bin völlig verwirrt. Wenn die Fehlermeldung mich über die Verwendung von Rohdatentypen warnt, weiß ich nicht, wo sie sich in meinem Programm befinden. Und wenn die Fehlermeldung vor etwas anderem warnt, weiß ich nicht, was das sein könnte. Außerdem: Warum sollte die addAll() -Methode die Zeile sein, die die Warnung verursacht? Ich kann das nicht für das Leben für mich herausfinden.

Ist das Problem, dass die Instanzvariablen der Roboter alle privat sind? Wenn ja, würde es beim Kompilieren nicht einen spezifischen Syntaxfehler erzeugen? Oder ist die ObservableList das Problem? Ich verstehe, dass OLs Schnittstellen sind, keine Datenstrukturen ... aber ich sehe nicht, wie das hier mich stolpern könnte.

Wenn jemand Hilfe oder Rat bieten kann, werde ich unglaublich dankbar sein.

Vielen Dank! -RAO

+3

Also haben Sie versucht, mit '-Xlint: unchecked 'zu kompilieren, wie die Compiler-Warnung zu sagte? –

+1

(Ich würde Sie dringend bitten, den Java-Namenskonventionen zu folgen, btw - Ihre Klassen sollten 'Robot',' RobotManager' und 'RobotApp' genannt werden.) –

+1

Link für [Java-Namenskonventionen] (https: // en .wikipedia.org/wiki/Naming_convention_ (Programmierung) #Java) –

Antwort

4

Ihr Code ist absolut sicher zu laufen (es hat Fehler, die Sie bei der Ausführung entdecken werden, aber diese haben nichts mit der Typsicherheit zu tun, nach der Sie fragen).

Grundsätzlich ist das Problem, dass die addAll() Methode, die Sie aufrufen, einen "varargs" -Parameter nimmt, dessen Typ ein generischer Typ ist. Für eine TableView<S>, TableView.getColumns() liefert eine ObservableList<TableColumn<S,?>> und die ObservableList<E>addAll() Methode, die Sie dann aufrufen, nimmt einen Vararg-Parameter: addAll(E... elements). Sie rufen also eine Methode mit der Signatur addAll(TableColumn<Robot, ?>... columns) auf.

Varargs werden verarbeitet, indem sie in ein Array konvertiert werden, sodass Sie implizit ein Array vom Typ TableColumn<Robot, ?>[] erstellen, wenn Sie die Methode addAll aufrufen.Da Arrays und parametrisierte Typen nicht gut zusammenspielen, kann der Compiler die Typsicherheit dieses Arrays nicht sicherstellen. Folglich gibt es eine Warnung aus. Siehe z. here für ein Beispiel, warum der Compiler die Typensicherheit hier nicht sicherstellen kann.

Die Autoren der addAll() Methode sollten es wahrscheinlich so codiert haben, dass es die Typensicherheit sicherstellte und kommentierte, so dass es diese Warnung vermied (wenn das möglich ist: Ich müsste länger darüber nachdenken, als ich recht habe jetzt).

die Warnung zu vermeiden, können Sie die add Methode zweimal einfach aufrufen:

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

Sie alternativ eine List von Tabellenspalten und passieren, dass auf die (anderen) addAll(...) Methode, die eine Sammlung statt nimmt erstellen eines Varargs-Parameters:

+0

WOW - Danke, es gibt eine Menge Details, die ich durchforschen kann - und, was noch wichtiger ist, lesen Sie weiter! Das ist unglaublich hilfreich, du hast keine Ahnung. :) – Pete

+0

Wenn Sie ein absolut vollständiges Verständnis von Generika wollen, empfehle ich "Java Generics and Collections" von Naftalin und Wadler. –

Verwandte Themen