问题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>
中重新声明。
那他们为什么要区别对待呢?
答案 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方法的确切期望。
因此,只要行为不应该改变或增强,就不需要在子接口中声明方法,但是如果你希望行为是特定的,那么你应该继续并重新声明它。