загрязнение кучи, java

List l = new ArrayList<Number>();
List<String> ls = l;       // unchecked warning
l.add(0, new Integer(42)); // another unchecked warning
String s = ls.get(0);      // ClassCastException is thrown

В документации по java сказано;

Кроме того, ситуация загрязнения кучи возникает, когда метод l.add называется. Второй формальный параметр статического типа метода add является String, но этот метод вызывается с фактическим параметром другой тип, Integer . Однако компилятор по-прежнему позволяет это вызов метода. Из-за стирания шрифта тип второго формального параметр метода добавления (который определяется как List.add (int, E)) становится объектом. Следовательно, компилятор разрешает вызов этого метода потому что после стирания типа метод l.add может добавить любой объект type Object, включая объект типа Integer

, мой вопрос касается части, которую я выделил жирным шрифтом. Я понимаю, что в строке 2 происходит загрязнение кучи, потому что l, являющийся List, ссылается на объект типа List. Но когда метод add вызывается для ссылки l, он не должен ожидать тип Number вместо String, поскольку l является ссылкой на ArrayList. Или это так, что после ls = l пространство в куче создается из List также для ссылки l? в этом случае имеет смысл то, что написано в java docs в части, выделенной жирным шрифтом

6
задан tomaas 19 August 2011 в 09:32
поделиться