Как уже было сказано, вы не можете скрыть метод суперкласса. Существует также веская причина, по которой вы не можете этого сделать: Полиморфизм позволяет передавать любой объект подтипа, где нужен объект супертипа. В вашем случае, если у вас есть метод
void foo(Operation op){op.delete()}
можно назвать
foo(new DailyMailProcessor())
Как вы можете видеть, Foo не знает точный тип оп, но из-за удаления в интерфейсе Операции, то метод delete может быть вызван.
Если вам захочется удалить некоторые методы из интерфейса подтипа, вы, вероятно, не используете поведенческий подтип ! Я предлагаю вам взглянуть на Liskov Principle, что является одним из основополагающих принципов объектно-ориентированного программирования.
Если у вас есть не поведенческий подтип, вы ошибочно пытаетесь добиться повторного использования кода по наследству. Вместо этого вы должны использовать композицию. . Покровительство состав над наследования (Item 16, Effective Java) Причина в пользу композиции в вашем случае очевидна: Вы не должны бросить UnsupportedOperationException (как указано в других ответах) и тем самым получить статическую безопасность
Edit:. Для уточнения что я имею в виду, когда говорю вам использовать композицию: вместо того, чтобы класс DailyMailProcessor расширял операцию, дайте ему переменную-член типа Операции и переадресация вызовов методам, которые вы хотите поддержать переменной-члену.
public interface Operation {
void move();
void delete();
void search(String criteria);
}
public class DailyMailProcessor {
private Operation op;
public DailyMailProcessor {/*instantiate op*/}
void move() {op.move();}
}
Я думаю, что вы просто не можете – Leo
Вы можете повторно аннотировать методы. Это скрывает реализацию, но очевидно, что методы определены в 'интерфейсе', поэтому вы не контролируете это. –