继承和泛型的构造函数问题

时间:2016-05-28 11:08:28

标签: java generics inheritance

我很难理解遗传的遗传。我得到的错误是:

Stage.java:66: error: constructor Stage in class Stage<T> cannot be applied to given types;
        {
        ^
  required: ArrayList<T>,double,ArrayList<T>
  found: no arguments
  reason: actual and formal argument lists differ in length
  where T is a type-variable:
    T extends Object declared in class Stage

我所拥有的是一个继承自Stage的名为Stage0(Stage的内联类)的子类。 Stage0将具有基本相同的功能栏 - Stage0将从其父类中@Override方法。 这是Stage类的第63行(Stage0的开头)

class Stage0 extends Stage<T>
{
    Stage0(ArrayList<T> inQ, double inputTime, ArrayList<T> outQ)
    {
        inputQueue = inQ;
        takesTime = inputTime;
        outputQueue = outQ;
    }

    @Override
    public boolean isStarving(double time)
    {
        return false;
    }
}

我的错误来源是什么?

干杯。

public class Stage<T> // equivalent to a 'storage'
{
    private T holdItem;
    private boolean blocked;
    private double takesTime, timeTaken, blockedTime, starveTime;
    private ArrayList<T> inputQueue, outputQueue;

    public Stage(ArrayList<T> inQ, double inputTime, ArrayList<T> outQ)
    {
        inputQueue = inQ;
        takesTime = inputTime;
        outputQueue = outQ;
    }

1 个答案:

答案 0 :(得分:2)

因为您没有在super构造函数代码中指定对Stage0的调用,所以编译器会为您插入它,就好像您键入了这个:

Stage0(ArrayList<T> inQ, double inputTime, ArrayList<T> outQ)
{
    super();                       // <======================
    inputQueue = inQ;
    takesTime = inputTime;
    outputQueue = outQ;
}

从错误消息中可以看出Stage没有匹配的构造函数。错误说:

  

构造函数类Stage中的Stage不能应用于给定类型...   
required:ArrayList,double,ArrayList   
发现:没有参数

也就是说,当您找到的最佳匹配构造函数为super()时,您正试图调用super(ArrayList<T>,double,ArrayList<T>)

解决方案是明确使用super,提供必要的参数。在您的情况下,再次基于错误消息,那将是:

Stage0(ArrayList<T> inQ, double inputTime, ArrayList<T> outQ)
{
    super(inQ, inputTime, outQ);   // <======================
    inputQueue = inQ;
    takesTime = inputTime;
    outputQueue = outQ;
}