Конкретный и ограниченный параметризованный тип при разработке типобезопасного API - PullRequest
0 голосов
/ 21 ноября 2008

Я хотел бы услышать от вас, ребята, как вы решаете, когда вам следует использовать конкретный параметризованный тип по сравнению с ограниченным параметризованным типом при разработке API, особенно (что меня больше всего волнует) определения класса / интерфейса.

Например,

public interface Event<S>{
  void setSource(S s);
}

public interface UserEvent extends EVent<User> // OR: UserEvent<S extends User> extends Event<S>
  // It will therefore be void setSource(User s);
}

Проблема использования конкретного параметра заключается в том, что я не могу воспользоваться преимуществом времени компиляции, которое я получаю при использовании setSource (), в новый интерфейс, скажем,

public interface AdminUserEvent extends UserEvent{
  void setSource(AdminUser s); // WHERE: AdminUser extends User. This is a method overloading, we also have a void setSource(User s) inherited from UserEvent.
}

Что я могу обойти для этого, так это выполнить проверку типа объекта User при вызове AdminUserEvent.setSource().

У вас когда-нибудь возникал этот вопрос при разработке API? И какие практики или правила вы будете использовать, когда возникнет такая ситуация? Спасибо.

Ус

Ответы [ 2 ]

1 голос
/ 14 августа 2009

Я думаю, что ваш закомментированный UserEvent<S extends User> подход является правильным - тогда вы можете объявить AdminUserEvent extends UserEvent<AdminUser>. Это все, что тебе нужно?

0 голосов
/ 21 ноября 2008

Если я правильно понимаю, это не имеет ничего общего с самими генериками, а скорее с параллельной иерархией. B extends A, BHandler extends AHandler и AHandler.handle(A), но BHandler.handle(B).

Да, я считаю, что это можно сделать безопасным с помощью генериков. То есть, если я правильно понял вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...