有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用JLists和vectors执行未经检查或不安全操作的两种情况

我有两个程序,每个程序在小程序中创建一个不同的选项卡,用户可以在一个选项卡中输入宠物类型,然后选择并将宠物类型添加或删除到另一个选项卡的列表中。我原以为我已经解决了所有的问题,但现在两者都给了我java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 我似乎不明白为什么我会收到这些错误。这是两个代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class CreatePanel extends JPanel
 {
   private Vector petList; //Instantiation of variables.  To save space, multiple variables
   private JButton button1; //were instantiated at a time when possible, such as the panels.
   private SelectPanel sPanel;
   private JLabel text1, redText;
   private JTextField petInput;
   private JTextArea petsIn;
   private Panel wPanel, alertPanel, petPanel, createPanel;



 public CreatePanel(Vector petList, SelectPanel sPanel)
  {
    this.petList = petList;
    this.sPanel = sPanel;


    // orgranize components here
    // here is an example
    setLayout(new GridLayout(1,2));

    text1 = new JLabel("Enter a Pet Type"); //Creation of the visible portions of the applet
    petInput = new JTextField();
    button1 = new JButton("Create a Pet");
    petsIn = new JTextArea("No Pet");
    wPanel = new Panel(); //Panels have to be used to ensure the porper layout of the
    petPanel = new Panel();  //applet so it conforms to assignment specifications
    createPanel = new Panel();  //making for a pretty panel, but some very ugly code
    alertPanel = new Panel();
    alertPanel.setLayout(new GridLayout(1,2));
    createPanel.setLayout(new GridLayout(2,3));
    petPanel.setLayout(new GridLayout(1,2));  //Each panel has its own layout, making for layouts
    wPanel.setLayout(new GridLayout(3,1));  //in layouts to get everything looking correct.
    button1.addActionListener(new ButtonListener()); //adds the listener to the button

    add(wPanel);
    wPanel.add(alertPanel);
    alertPanel.add(redText);
    wPanel.add(petPanel);
    petPanel.add(text1);
    petPanel.add(petInput);
    wPanel.add(createPanel);
    createPanel.add(new JLabel());
    createPanel.add(button1);
    createPanel.add(new JLabel());  //Have to create several blank labels to get position of
    createPanel.add(new JLabel());  //the create pet button to be positioned correctly.
    createPanel.add(new JLabel());
    createPanel.add(new JLabel());
    add(petsIn);


  }

  private class ButtonListener implements ActionListener
   {
    public void actionPerformed(ActionEvent event)
     {
         String inputPet = petInput.getText(); //Gets the user input pet
         boolean checker = false; // A boolean check type so pets can't be added repeatedly

         for (int p = 0; p < petList.size(); p++){ //Runs a check through the petList vector
             if (inputPet.equalsIgnoreCase((String) petList.get(p))){ //If a pet already exists (ignoring case) then the check is set to true
                 checker = true; //for a later if loop to inform the user.
                 break;
             }
         }


         if(inputPet.equals("")){
             redText.setText("Please enter a pet type.");
             redText.setForeground(Color.red);
         } else if (checker == true){
             redText.setText("The pet type already exists.");
             redText.setForeground(Color.red);
         } else {
             petList.add(inputPet);
             String addedPets = (String) petList.get(0);
             for(int i = 1; i < petList.size(); i++){
                 addedPets += "\n" + (String) petList.get(i);
             }
             redText.setText("Pet type added.");
             redText.setForeground(Color.red);
             petsIn.setText(addedPets);
             sPanel.updateUI();
         }
         redText.setText("");

     } //end of actionPerformed method
  } //end of ButtonListener class

} //end of CreatePanel class

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;

public class SelectPanel extends JPanel
 {
   private Vector petList, selectList;
   private Panel bPanel, nPanel;
   private JLabel sPets, aPets, nPets;
   private int numPets = 0;
   private JButton addPet, remove;
   private JList petsAvail, petTypes;
   private JScrollPane sPane, sPane2;

   public SelectPanel(Vector petList)
     {
      this.petList = petList;

      this.setLayout(new BorderLayout());

      bPanel = new Panel();
      nPanel = new Panel();
      nPanel.setLayout(new GridLayout(1,2));
      bPanel.setLayout(new GridLayout(2,1));

      petTypes = new JList(petList);
      petTypes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      sPane = new JScrollPane(petTypes);
      petList.add(0, "Available pet(s)");

      selectList = new Vector();
      petsAvail = new JList(selectList);
      petsAvail.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      sPane2 = new JScrollPane(petsAvail);
      selectList.add(0, "Selected pet(s)");

      aPets = new JLabel("Available pet(s)");
      nPets = new JLabel("Selected pet(s)");
      nPets = new JLabel("The number of selected pets:" + numPets);
      addPet = new JButton("Add");
      remove = new JButton("Remove");

      add(petsAvail, BorderLayout.EAST);
      add(petTypes, BorderLayout.WEST);
      add(nPanel, BorderLayout.SOUTH);
      nPanel.add(nPets);
      add(bPanel, BorderLayout.CENTER);
      bPanel.add(addPet);
      bPanel.add(remove);

      addPet.addActionListener(new ButtonListener());
      remove.addActionListener(new ButtonListener());


     // orgranize components for the panel
  }

 public void updatePetList()
  {
        petTypes.updateUI();
        petsAvail.updateUI();
        //This method can refresh the appearance of the list of pets
        //by calling updateUI() method for the JList.
        //It can be called from the CreatePanel class whenever a new pet type
        //is added to the vector and the JList appearence needs to be refreshed.
  }

 private class ButtonListener implements ActionListener
  {
       public void actionPerformed(ActionEvent event)
        {
            Object which = event.getSource();

            if(which == addPet){
                for (int p = 1; p < selectList.size(); p++){
                    boolean check = false;

                    if(selectList.contains(petTypes.getSelectedValue())){
                        check = true;
                        break;
                    } else if(check == false){
                        selectList.addElement(petTypes.getSelectedValue());
                        petsAvail.updateUI();
                        numPets++;
                    }
                }
            } else if (which == remove){
                selectList.removeElement(petsAvail.getSelectedValue());
                updatePetList();
                numPets--;
            }



            //When the added button is pushed, the selected pet
            //should be added to the right list and the number of
            //selected pets is incremented by 1.
            //When the remove button is pushed, the selected pet
            //should be removed from the right list and the number of
            //selected pets is decremented by 1.
            //
            //Be careful for the cases when no item has been selected.
        }
  } //end of ButtonListener class

} //end of SelectPanel class

对于这些错误的原因以及如何处理,我们将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    您收到该警告是因为您使用的是泛型类,而没有指定泛型类型。看起来你的petList向量应该是一个字符串向量。您的petList声明应该如下所示

    private Vector<String> petList
    

    后来的某个地方

    petList = new Vector<String>()
    

    该警告旨在帮助您认识到,如果您在向量中开始混合类型(通常是偶然的),那么代码在运行时可能不会按预期运行。从技术上讲,您可以将多种类型的对象添加到petList向量中,即使您确实只需要字符串。没有任何东西可以阻止您向向量中添加整数、其他类或更多向量。有时这是程序员故意做的,但大多数时候,您真的只希望在泛型类(本例中的向量)中使用一种类型的对象。通过指定要放入向量的对象类型,编译器可以帮助您捕获这些类型的意外混合(例如,如果您试图将整数放入petList向量)。在编译时修复这类问题比在运行时找出错误要容易得多

    请阅读此处以了解有关Java中泛型的更多信息: http://docs.oracle.com/javase/tutorial/java/generics/