The TCollection only "knows" that it holds a TCollectionItem instances. Even if you, as a developer, only insert there "TMyCollectionItemDescendant", the TCollection class does not know it, and also it has no way of ensuring it
at compile time. The author of TCollection had no choice but to declare TCollection.Items as a list of TCollectionItem instances. So it returns just TCollectionItem.
This is solved using generics in newer versions. Instead of TCollection, use the
generic lists to have various containers (like lists) return the appropriate type. The FPC unit FGL (see
reference and
wiki ) implements various generic containers, e.g. the simplest generic list is TFPGList.
In FPC 3.1.1 there is also a larger set of units dealing with generic containers (in a Delphi-compatible way, BTW), the main unit is called Generics.Collections. It can be considered an alternative to FGL (it's much better, IMHO, but it's not available in FPC <= 3.0.2 yet).
Another alternative to FGL is inside the "fcl-stl" package, with units like GVector. These have interface inspired by C++ generic containers.