код в ссылке:
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));
что означает, что вы добавляете целое число к массиву строк