为什么我不能在arraylist中使用getFixed方法?我怎样才能使它工作?

时间:2018-04-24 18:20:05

标签: java arraylist methods

 import java.util.*;
 public class MainFile{
 public static void main(String[] args){
    ArrayList<TypeExpences> listOfTypes = new ArrayList<TypeExpences>();
    Water waterExp = new Water(0, "fafasd", 10, "cubic meters", 2, 1);
    listOfTypes.add(waterExp);
    System.out.println((listOfTypes.get(0)).getFixed());
    }
}

public class Water extends UseExpences{
    int pricePer2;  
    public Water(int kod, String descr, int fixed, String unit, int 
     pricePer, int pricePer2){
    super(kod, descr, fixed, unit, pricePer);
    this.pricePer2 = pricePer2;
    }
   public int getFixed(){
   return super.getFixedPrice(fixedPrice);
   }
}

public class UseExpences extends TypeExpences{
    protected int fixedPrice;
    protected String unitOfMeasurement;
    protected int pricePerMeasurementUnit;

    public UseExpences(int kod, String descr, int fixed, String unit, int 
     pricePer){
        super(kod, descr);
        fixedPrice = fixed;
        unitOfMeasurement = unit;
        pricePerMeasurementUnit = pricePer;
    }

    public int getFixedPrice(int fixedPrice){
        return fixedPrice;
    }
}

public class TypeExpences {
    protected int code;
    protected String description;
    public TypeExpences(int kod, String descr){
        code = kod;
        description = descr;
    }
    protected int getCode(int code){
        return code;
    }
    protected String getDescription(String description){
        return description;
    }
}

错误:

C:\Users\laptopara\Desktop\ask>javac MainFile.java
MainFile.java:39: error: cannot find symbol
System.out.println((listOfTypes.get(0)).getFixed());
                                       ^        
symbol:   method getFixed()
location: class TypeExpences
1 error

如果我做System.out.println(waterExp.getFixed());它有效。

如何使用System.out.println((listOfTypes.get(0))。getFixed());?

1 个答案:

答案 0 :(得分:1)

啊,我认为你的问题是,你使用多态编程...... 您有一个对象ArrayList<TypeExpences> listOfTypes,一个ArrayList存储类TypeExpences的对象。多亏了多态编程,它还可以存储TypeExpences子类的对象,如Water

您现在的问题是,您无法使用子类Water中声明的方法!您只能使用已在基类TypeExpences中声明的方法,我想方法public int getFixed()尚未声明。

将您的代码更改为此...

ArrayList <Water> listOfTypes = new ArrayList<Water>();

...解决这个问题。或者,您可以在基类public int getFixed()中实现方法TypeExpences并在子类中覆盖它。

也许还要看一下这个tutorial或类似的东西......

修改

您可以使用这样的界面

public interface AllMyObjects
{
    public abstract int getFixed();
}

现在在您使用的每个类中实现此接口,如下所示:

public class Water implements AllMyObjects
{
    ...
    @Override public int getFixed()
    {
        return super.getFixedPrice(fixedPrice);
    }
}

...

public class Phone implements AllMyObjects
{
    @Override public int getFixed()
    {
        ...
    }
}

在此更改后,您的数组列表如下:

ArrayList <AllMyObjects> listOfTypes = new ArrayList<>();

现在它应该可以工作,写评论......