На самом деле это не та же подпись. Дочерний интерфейс содержит параметры типа и переопределяет довольно схематичную сигнатуру родительских методов. Вы не обязаны это делать, но я считаю это хорошим способом сделать API более читабельным и даже более четко сформулированным.
Учитывая тот факт, что ребенок реализует некоторые методы, для меня важно перечислить остальные, чтобы подчеркнуть, что они на самом деле должны быть определены.
Более практическая причина - помочь документировать вещи. Вы не можете сказать
{@link #tryAdvance(java.util.function.IntConsumer)}
, если не существует явно определенного метода
@Override
boolean tryAdvance(IntConsumer action);
Обратите внимание, что tryAdvance
, определенный в дочернем элементе, относится к конкретной подписи:
/**
* {@inheritDoc}
* @implSpec
* If the action is an instance of {@code IntConsumer} then it is cast
* to {@code IntConsumer} and passed to
* {@link #tryAdvance(java.util.function.IntConsumer)}; otherwise
* the action is adapted to an instance of {@code IntConsumer}, by
* boxing the argument of {@code IntConsumer}, and then passed to
* {@link #tryAdvance(java.util.function.IntConsumer)}.
*/
@Override
default boolean tryAdvance(Consumer<? super Integer> action)