Collection <e>&amp; Queue <e>&amp; BlockingQueue <e>接口

时间:2016-03-09 08:49:15

标签: java collections

问题1:

在阅读JDK源代码时,我发现接口boolean add(E e);&amp; Collection<E>&amp; Queue<E>中定义了方法BlockingQueue<E>

我无法理解这一点。根据我的理解,如果超级接口定义了一个方法,那么扩展该超级接口的子接口不需要再次定义该方法。

那么为什么这个方法被定义了三次呢?

问题2:

另外,我注意到,与boolean add(E e);接口Queue<E>中声明的方法不同,然后在接口BlockingQueue<E>中重新声明,E poll();方法仅被声明在界面Queue<E>中,尚未在界面BlockingQueue<E>中重新声明。

那他们为什么要区别对待呢?

3 个答案:

答案 0 :(得分:3)

  

问题1:在读取JDK源代码时,我发现了boolean add(E e);在接口Collection&amp; Queue&amp; BlockingQueue。

中定义      

我无法理解这一点。根据我的理解,如果超级接口定义了一个方法,那么扩展这个超级接口的子接口不需要再次定义这个方法。

是的,您不需要重新定义它。我猜它是可能的,因为您需要重复声明才能添加新的JavaDoc注释,即每个接口都有add(E)等具体的描述。

  

问题2:我也注意到与布尔加法(E e)不同;在接口Queue中声明的方法,然后在接口BlockingQueue中重新声明,E poll();方法仅在接口队列中声明,并且未在接口BlockingQueue中重新声明。

     

那为什么他们被区别对待?

它可能与上面相同。 poll(E)对于一般队列和阻塞队列的工作方式相同,因此不需要不同的文档。

答案 1 :(得分:2)

此处的差异仅在于文档。 E poll()中未提及BlockingQueue方法签名,因为Queue的合同相同和BlockingQueue以及两者的文档都解释了2数据结构的行为是相同的。

如果您查看Queue.add()BlockingQueue.add()的文档,您会在BlockingQueue.add()方法上看到另外一句话。

Queue.add()

  

如果可以,则将指定的元素插入此队列   所以立即不违反容量限制,返回true   成功后如果没有空格则抛出IllegalStateException   目前可用。

BlockingQueue.add()

  

如果可以,则将指定的元素插入此队列   所以立即不违反容量限制,返回true   成功后如果没有空间则抛出IllegalStateException   目前可用。使用容量限制队列时,它是   通常优先使用offer

这是为了帮助开发人员使用相关对象。

从技术上讲,add()方法是相同的,因此BlockingQueue永远不需要显式指定方法签名。

答案 2 :(得分:0)

我认为这更多地与定义行为方法所期望的行为有关。从技术上讲,不需要在队列或阻塞队列中定义添加,但由于添加的行为可能会有所不同,具体取决于Collection是Set还是Queue,因此重新定义它会更好,以便人们可以了解Queue add方法的确切期望。

因此,只要行为不应该改变或增强,就不需要在子接口中声明方法,但是如果你希望行为是特定的,那么你应该继续并重新声明它。