En vrai c'est une feature qui vient d'un bug. Les tableaux n'ont pas été correctement typés en Java. Tu peux faire ca:
Object[] t = new String[1];
t[0] = new Integer(1);
ca compile, ca plante au runtime. Si tu utilises une ArrayList (qui avec les génériques est correctement typé) au lieu d'un tableau:
ArrayList<Object> t = new ArrayList<String>();
t.add(new Integer(1));
Et la ca compile pas. Normal. Ce qui aurait du être le cas pour les tableaux.
Après on peut se dire qu'on pourrait faire compiler ce code en utilisant le bug du typage des tableaux. t devient un tableau et pas seulement une variable:
ArrayList<Object>[] t = new ArrayList<String>[0];
t[0] = new ArrayList<Object>();
t[0].add(new Integer(1));
Et donc ca planterait à la derniere ligne.
Donc finalement, comme tu peux ne pas savoir ce qu'il y a dans un tableau, même si c'est typé, autant obliger à créer des raw types, comme ca tu peux être sûr que ca marche, pas de bug de runtime.