Bene, una classe generica è per definizione non uguale a una classe raw. Quello che stai cercando ci nasconde il problema dell'istanziazione di ArrayLists (gli elenchi effettivi, non i loro tipi).
ArrayList raw = new ArrayList();
funzionerà e permetterà qualsiasi tipo di elemento, oggetti, primitive, qualsiasi cosa. D'altra parte,
ArrayList<?> generic = new ArrayList<?>();
non funzionerà poiché non è chiaro, in fase di compilazione, quali elementi effettivi saranno presenti nella lista. Quindi, per rendere la lista (quasi) ampiamente utilizzabile come quella grezza, puoi istanziarla in questo modo:
ArrayList<?> generic = new ArrayList<Object>();
(Ciò manterrà solo oggetti reali, però, senza primitive.)
generic
e raw
non saranno mai uguali dal punto di vista del tipo e non avrà senso che siano uguali.
Che cosa puoi fare con i tipi generici anziché quelli grezzi? Bene, sii al sicuro in fase di compilazione. :) Viceversa? Usa le primitive (i tipi generici devono ereditare da Object
quali primitive non lo fanno).