On Tue, 29 Jul 2025, Mattias Gaertner via fpc-devel wrote:
And each list needs to be
TMyFinalItem1 =
specialize TFeatureXForList<
specialize TFeatureYForList<
specialize TFeatureZForList< specialize TFpgList<TItem1>
>
>
>;
IMO that does not look human friendly for reading and debugging.
Let's hope it was a contrived example :-)
Currently I can swap the order, and git it working by creating a non
generic base.... But that introduces dependencies that were not wanted...
Also, the error by the compiler is
Error: Generics without specialization cannot be used as a type
for a variable
But
generic FooChild<F: TFoo> = class(F)
- F is not a variable
- TFoo in not a type (for somethnig), TFoo is a constraint
The problem is the ambiguity of TFoo, because Delphi (aka modeswitch)
distinguishes TFoo, TFoo<> and TFoo<,>:
type
generic TFoo<A> = class
procedure Bar; virtual;
end;
generic TFoo<A,B> = class
procedure NoBar; virtual;
end;
generic FooChild<F: TFoo> = class(F)
procedure Bar; override;
end;
So you have to be more specific:
generic FooChild<A,F: specialized TFoo<A>> = class(F)
procedure Bar; override;
end;
If that syntax was allowed, it should mean that
- F must be of any type that is (a descendand of) a specialization of
TFoo.
So this is NOT to allow FooChild to be specialized with another generic,
but with a (any) specialization of that generic.
AFAIK there is currently no "Any" placeholder in constraints. It would
be something like
generic FooChild<F: specialized TFoo<>> = ...
Although that looks like something was forgotten. Maybe better:
generic FooChild<F: specialized TFoo<*>> = ...
it seems to me that 'specialized' is not compatible with 'any',
as specialized needs a specific type: it actually creates the type.
So that would need to become something like
generic FooChild<F: TFoo<*>> = ..
Michael.
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel