2014-01-25 51 views
1
public class Packages 
    { 
    private ArrayList shipmentList = new ArrayList(); 
    private double totalWeight; 

    public Packages(String shiplist) throws IOException 
    { 
     Scanner scanFile = new Scanner(new File(shiplist)); 
     scanFile.useDelimiter("\n"); 
     while(scanFile.hasNext() == true){ 
      String pack = scanFile.next(); 
      Scanner splitter = new Scanner(pack); 
      splitter.useDelimiter(" "); 
      int id = splitter.nextInt(); 
      double weight = splitter.nextDouble(); 
      String state = splitter.next(); 
      shipmentList.add(new Packet(id, weight, state)); 
     } 
     this.totalWeight = 0; 

    } 

    public String toString() 
    {String allShipments =""; 
    for(int i =0;i<shipmentList.size();i++) 
     allShipments += shipmentList.get(i) + "\n"; 
    return allShipments; 
    } 
    //needs work. Cannot find method isLight() from class packet, yet toString() fires fine. 
    public void displayLightPackages() 
    { 
    for (int i=0;i<shipmentList.size();i++){ 
     Packet thisShipment = shipmentList.get(i); 
     if(thisShipment.isLight() == true){ 
      System.out.println("Package: "+ shipmentList.get(i).toString()+" Is light."); 
     }else{ 
      System.out.print(""); 
     } 
    } 
} 

方法displayLightPackages()给我错误。这里是包类:爪哇,无法找到符号和麻烦从数组列表中提取dataType

public class Packet 
{ 
    // instance variables - replace the example below with your own 
    private int idNumber; 
    private double weight; 
    private String state; 

    public Packet(int idNumber, double weight, String state) 
    { 
     this.idNumber= idNumber; 
     this.weight = weight; 
     this.state = state; 
    } 
    public boolean isHeavy() 
    { 
     return (weight>10); 
    } 
    public boolean isLight() 
    { 
     return (weight<10); 
    } 
    public String toString() 
    { 
     return "ID: "+idNumber+" WEIGHT: "+weight+" STATE: "+state; 
    } 
} 

toString方法触发从主要方法的调用正常,但是,我不能从包类访问任何其他方法。构造函数在将数据包添加到包含所有数据包的Arraylist时工作。我试图在displayLightPackages中定义一个数据包,但是我收到了一个不兼容的类型错误。在displayLightPackages方法中,当我使用代码

shipmentList.get(i).isLight() 

我在编译器找不到符号isLight时出现错误。我怀疑这个错误与arraylist中的dataType有关,但除此之外,我现在处于亏损状态。

谢谢

回答

2

ArrayList没有类型的,所以一切从它的到来是一个Object。相反,Object没有isLight()方法,因此“无法找到符号”错误。

为了解决这个问题,无论是键入ArrayList ...

private ArrayList<Packet> shipmentList = new ArrayList<>(); 

...或转换为Packet当您使用get

((Packet)shipmentList.get(i)).isLight() 

两个选项中,键入ArrayList是更简单和更安全,因为每当你从中获得价值时,你都不必记得投。

+0

哇,谢谢你。彻底解决了我的问题,我学到了一些东西!再次感谢。 – user451711

2

变化

private ArrayList shipmentList = new ArrayList();

private ArrayList<Packet> shipmentList = new ArrayList<Packet>();

编译器不知道shipmentList持有包。事实上,编译器知道shipmentList是一个Objects的列表。所以你可以做shipmentList.get(i).toString(),因为toString()是Object类的方法。但是您不能在object上调用isLight()方法,因为它不存在于Object上下文中。你必须明确地说,shippingList是ArrayList<Packet>的类型,或者将元素抛到Packet:Packet thisShipment = (Packet) shipmentList.get(i);