当项目排队到队列对象时,队列对象仍为空

时间:2014-03-12 06:33:40

标签: java generics inheritance linked-list queue

我有两个班级,ClubpartyClub extends通用Queue<E>并实现fitnessInterface

Queue<E> implements QueueInterface<E>

分会

public class Club extends Queue<Bachelor> implements fitnessInterface{

   protected Queue<Bachelor> bachelorQ;

   public Club(){
       super();

       bachelorQ = new Queue<Bachelor>();
    }

public boolean Eligible(Bachelor bachelor){

       if(bachelor==null){throw new NullPointerException();}

       return true;
     }

@Override
public QueueInterface<Bachelor> enqueue(Bachelor bachelor){

       if(bachelor==null){
             throw new NullPointerException();
       else{
             bachelorQ.enqueue(bachelor); }

       return this; //the class queue
    }
}

派对

public class Party extends Club{
       super();
    }

@Override
public boolean Eligible(Bachelor bachelor){

   if(bachelor==null){throw new NullPointerException();}

   if(bachelor.getPushups()>=25){return true;}

   return false;

   }
}

Bachelor类扩展了QueueInterface并且有一个构造函数,它接受Integer作为参数,并且具有getPushUps()方法。

问题是当我创建一个Party对象并试图将Bachelors ralph或charlie排队时,它仍然是空的。

我的通用队列类非常完美。它有dequeueenqueueisEmptypeeksizetoString方法。一切正常。

主要

public static void main(String[] args){

     Party bigParty = new Party();

     Bachelor jack,charlie,ralph;

     jack = new Bachelor(15);
     ralph = new Bachelor(27);
     charlie = new Bachelor(39);

     //Eligibility tests
     System.out.println(bigParty.Eligible(charlie));
     System.out.println(bigParty.Eligible(ralph));
     System.out.println(bigParty.Eligible(jack));

     System.out.println(bigParty.enqueue(ralph));
     System.out.println(bigParty.enqueue(charlie));
     System.out.println(bigParty.size());
     System.out.println(bigParty.bachelorQ.size());
}

输出继电器

true
true
false
[]
[]
0
2

2 个答案:

答案 0 :(得分:1)

当你混合继承和组合时会发生这种情况。检查此方法:

@Override
public QueueInterface<Bachelor> enqueue(Bachelor bachelor){

       if(bachelor==null){
             throw new NullPointerException();

       bachelorQ.enqueue(bachelor); 

       return this; //the class queue
    }
}

您在enqueue()上调用bachelorQ,但返回this。两者都是不同的引用,指向不同的对象。

您应该返回bachelorQ,或者只是调用super.enqueue(bachelor)

顺便说一句,既然你已经延长了Queue<Bachelor>,我就不会在那里看到bachelorQ引用的必要性。你可以删除它。或者甚至更好,不要从Queue<Bachelor>延伸。你应该尽可能优先考虑构图而不是继承。

答案 1 :(得分:1)

我同意Rohit Jain所说的一切。但是,这里还有一个问题。在您的enqueue方法中,您已将内容包装在if(bachelor==null)块中。因此,如果单身汉无效,bachelorQ只会将单身汉排队。我认为这不是你打算如何工作的。

@Override
public QueueInterface<Bachelor> enqueue(Bachelor bachelor){

       if(bachelor==null){
             throw new NullPointerException();

       bachelorQ.enqueue(bachelor); 

       return this; //the class queue
    }
}

我建议你重写你的俱乐部课程,看看更像这样的东西:

public class Club implements fitnessInterface
{
    protected Queue<Bachelor> bachelors;

    public Club(){
        super();
        bachelors = new Queue<Bachelor>();
    }

    public boolean Eligible(Bachelor bachelor)
    {
        if(bachelor==null) throw new NullPointerException();
        return true;
     }

    @Override
    public QueueInterface<Bachelor> enqueue(Bachelor bachelor)
    {
        if(bachelor==null) throw new NullPointerException();
        bachelors.enqueue(bachelor); 
        return bachelors;
    }
}