In Delphi 2009 and above the new Generics.Collections unit is highly useful.

You can declare containers like this:

X : TObjectList<TMyClass>;

It will hold and own the items.

Then iterate like this:

Item : TMyClass;
...
for Item in X do
...

I like this style of generic containers as it saves time typing and removes the need of casting. There is also a hashtable called TDictionary<K,V>.
But I agree that more advanced use of generics can indeed lead to trouble