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