Общая документация по Java SE - PullRequest
1 голос
/ 25 ноября 2011

Загрязнение кучи

Документация говорит в последнем абзаце этого раздела, что The static type second formal parameter of the add method is String, but this method is called with an actual parameter of a different type, Integer. add(int,Object) вызывается на l, статический тип которого List<Number>, как говорит доктор,Может кто-нибудь объяснить, почему статический тип String, когда кажется, что это Number.

Спасибо, Джордж

Загрязнение кучи

Ответы [ 2 ]

3 голосов
/ 25 ноября 2011

код в ссылке:

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

"хитрая" часть -

List l

Он определяет переменную типа List, но без типа, поэтому компилятор (из-за реализации обобщенных java) «теряет» тип. Из этой инструкции информация о типе теряется, и java позволяет вам делать «почти все».
С присвоением

List<String> ls = l;

вы создаете ls как массив строк, поэтому, когда он вызывает

l.add(0, new Integer(42));

это может быть псевдоним

ls.add (0, новое целое число (42));

что означает, что вы добавляете целое число к массиву строк

1 голос
/ 25 ноября 2011

Статический тип ls равен List<String>, потому что это то, что было определено как.

Использование стирания типа позволяет изменить статический тип.Если это сделано неправильно, вы можете получить «кучу загрязнений».

...