Это действительно проблема.Если кто-то вызывает remove(o)
и тип o
не E
, это обычно программная ошибка, которая пытается удалить неправильную вещь.Проверка типов не смогла защитить нас от ошибки.
Хотя хорошая IDE (IntelliJ) может обнаруживать такие проблемы и предупреждать нас, разработчики API должны были предоставить более точную подпись для использования проверки типов компилятора.(IDE обманывает здесь - он знает значение Set.remove()
, потому что это стандартный API. IDE не будет предоставлять такую же справку для пользовательских API)
Для API запросов, таких как contains()
, можно принятьне- E
аргумент и вернуть тривиальное ложное.Таким образом, мы можем иметь оба
boolean contains(Object o);
boolean contains2(E o);
Для мутации API как remove()
, это спорно, должен ли он принять не- E
аргумент.Однако дебаты будут спорными, учитывая реальность стирания - на самом деле нет другого выбора, кроме как принять аргумент не-E и молчать об этом.Тем не менее, у нас может быть два метода
boolean remove(Object o);
boolean remove2(E o);
В большинстве случаев программисты могут вызывать contains2/remove2
для дополнительной безопасности типов.