Delphi interfaces and IList<T> (or TObjectList<T>)
delphi, generics, spring4d
Solution
`CreateObjectList` has a generic constraint that its type parameter is a class:
function CreateObjectList<T: class>(...): IList<T>;
Your type parameter does not meet that constraint since it is an interface. The thing about an object list is that it holds objects. If you take a look at `TObjectList` in `Spring.Collections.Lists` you'll see that it also has the generic constraint that its type parameter is a class. And since `CreateObjectList` is going to create a `TObjectList<T>`, it must reflect the type constraint.
The raison d'être of `TObjectList<T>` is to assume ownership of its members through the `OwnsObjects`. Much in the same way as do the classic Delphi RTL classes of the same name. Of course you are holding interfaces and so you simply do not need this functionality. You should call `CreateList` instead. A plain `TList<T>` is what you need, even if you refer to it through the `IList<T>` interface.
LMyList := TCollections.CreateList<IMyObjChild>;
Problem
I'm trying to implement Spring 4 Delphi and only program to interfaces instead of classes. However this seems impossible when you want to use a TObjectList. Consider the following code: ``` unit Unit1; interface uses Spring.Collections, Spring.Collections.Lists; type IMyObjParent = interface ['{E063AD44-B7F1-443C-B9FE-AEB7395B39DE}'] procedure ParentDoSomething; end; IMyObjChild = interface(IMyObjParent) ['{E063AD44-B7F1-443C-B9FE-AEB7395B39DE}'] procedure ChildDoSomething; end; implementation type TMyObjChild = class(TInterfacedObject, IMyObjChild) protected procedure ParentDoSomething; public procedure ChildDoSomething; end; { TMyObj } procedure TMyObjChild.ChildDoSomething; begin end; procedure TMyObjChild.ParentDoSomething; begin end; procedure TestIt; var LMyList: IList<IMyObjChild>; begin TCollections.CreateObjectList<IMyObjChild>; //[DCC Error] Unit1.pas(53): E2511 Type parameter 'T' must be a class type end; end. ``` I know I can change IMyObjChild to TMyObjChild in the example above, but if I need that in another unit or a form then how do I do this? Trying to program only to interfaces seems too hard or impossible as soon as you need a TObjectList. Grrr... Any ideas or help?