当您查看一些示例代码(我删除了所有不必要的代码)时,最好解释这个问题:
program XE8GenericArrayTest;
{$APPTYPE CONSOLE}
type
TArrayUtilCls<T: class> = class
public
class procedure AddArray<U: T>(var Arr_: TArray<T>; ArrayToAdd: TArray<U>);
class procedure MergeArrays(var Arr_: TArray<T>; ArrayToAdd: TArray<T>);
end;
TBaseCls = class
end;
TChild = class(TBaseCls)
end;
{ TArrayUtilCls<T> }
class procedure TArrayUtilCls<T>.AddArray<U>(var Arr_: TArray<T>;
ArrayToAdd: TArray<U>);
begin
// ... some logic to merge the arrays
end;
class procedure TArrayUtilCls<T>.MergeArrays(var Arr_: TArray<T>;
ArrayToAdd: TArray<T>);
begin
// THE FOLLOWING CODE LINE DOES NOT COMPILE
// E2515 Type parameter 'U' is not compatible with type 'T'
AddArray<T>(Arr_, ArrayToAdd);
end;
var
ArrBase: TArray<TBaseCls>;
ArrChildren: TArray<TChild>;
begin
// ... allocate memory
TArrayUtilCls<TBaseCls>.AddArray<TChild>(ArrBase, ArrChildren);
end.
类TArrayUtilCls
包含一个将子类型数组添加到基类型数组AddArray
的方法 - 这样可以正常工作。
现在我还想添加一个对2个相同类型的数组执行相同操作的方法:MergeArrays
。
我认为它应该只是调用AddArray<T>
方法,因为U
必须从T
延伸:但是Delphi给了我一个编译错误(参见源代码中的注释) )。