2014-10-20 2 views
0

Я работаю со старым кодом на Java со спины, когда не было никаких дженериков. Hashmap определяется в этом коде без дженериков, как:Исключения из кода старой Java

Map A = new HashMap(); 

В этом коде, как я хотел бы, чтобы определить, что поставить в ключ и значение, и если пользователь может поместить любой ключ, чем как бы это сравнить его. Так как метод equals не перезаписан?

+0

Ориентировочные значения. * Shudder *. –

+2

Нет проблем. Но если вам нужно поддерживать большую унаследованную систему, начните с добавления дженериков. Обновление API с использованием устаревших меток. Используйте FindBugs. Потому что любое исключение должно быть связано с некоторой ошибкой. –

ответ

1

К сожалению, поскольку для карты не существует никаких дженериков, вы не можете ограничивать то, что можно положить. Для сравнения будет вызываться метод equals и если его не переопределить для ключа, который вы положили, то Object.equals будет называться

+0

В этом случае код полностью зависит от типа ключа, который мы вставляем, и он может создавать исключение, если вставлены разные типы ключей (из-за ввода пользователем) – piyush

1

Даже с помощью дженериков пользователь может поместить любую пару ключ/значение внутри нужной им карты. Следующий код компилируется нормально и будет работать отлично во время выполнения:

Map<String,String> map = new HashMap<>(); 
(Map)map).put("key", new Double(2)); 

Это будет только проблема, когда у меня есть код, как

(String)map.get("key"); 

как это приведет к ClassCastException во время выполнения.

  • Если вы создаете API и вы подвергаете изменяемый Map с дженериков, то можно предположить, что пользователь будет ставить только в значениях правильного типа
  • Если вы создаете API и вы подвергаете изменяемый Map без дженериков, вам необходимо четко документировать его. В таком случае вы могли бы рассмотреть возможность не показывать карту, а вместо этого предоставить метод put в API, а не там, где вы жестко кодируете тип объектов, которые вы принимаете.
  • Если вы просто пишете свой собственный внутренний код и застреваете в JDK1.4 или ниже, у вас есть полный контроль над тем, что происходит на этой карте. Просто будь осторожен. То же самое относится к работе с устаревшим API. Это будет/должно быть документировано, что можно поместить на карту, и вам нужно это уважать.
0

В дни до дженериков все контейнеры работали с объектами Object.

Обязанности программиста - убедиться, что все, что он помещает в контейнер, совместимых типов.

В этом случае оно не должно быть слишком проблематичным, если существуют различные классы объектов, используемых в качестве ключей, поскольку HashMap опирается на hashCode и equals методов, и те не бросают исключения, если они правильно написаны.

В случае, если метод equals не переопределен, он, вероятно, использует Object equals, который в основном сравнивает ссылки. Но следует отметить, что такие классы, как Integer и Date, имеют свои собственные методы equals. Однако они не будут верны ни для чего, что не относится к одному классу.

Настоящая проблема с такими коллекциями заключается в том, что когда вы извлекаете что-либо из них, вы должны быть абсолютно уверены, что получили правильный тип.

Так что в прежние времена было много if (o instanceof MyClass) then..., где были задействованы коллекции, и программист не имел контроля над типами объектов.

Вот почему дженерики были изобретены.

Смежные вопросы