7

考虑以下代码提取:

type
  MyIntf = interface
    procedure Work(param: OleVariant);
  end;

  MyClass<T> = class
    procedure MyWork(param: T);
  end;

var
  intf: MyIntf;

procedure MyClass<T>.MyWork(param: T);
begin
  //compiler error: E2010 Incompatible types: 'OleVariant' and 'T'
  intf.Work(param);
end;

如上所示,这无法使用错误消息进行编译。我怎么能从我的泛型类中调用该Work函数?

4

1 回答 1

8

您的代码无法编译,因为编译器无法在泛型类的编译时保证有可能转换为所有可以想象的T.

面对时

intf.Work(param);

在泛型方法中,编译器需要知道如何转换paramOleVariant. 它不能这样做。这是泛型与模板相比的限制之一。


TValue最简单的解决方案是在单元的帮助下在运行时进行转换Rtti

procedure MyClass<T>.MyWork(param: T);
begin
  intf.Work(TValue.From<T>(param).AsVariant);
end;

这是一个示例测试程序来证明可以TValue完成这项工作:

program SO15113162;
{$APPTYPE CONSOLE}

uses
  Rtti;

procedure Work(param: OleVariant);
begin
  Writeln(param);
end;

type
  MyClass<T> = class
    class procedure MyWork(param: T);
  end;

class procedure MyClass<T>.MyWork(param: T);
begin
  Work(TValue.From<T>(param).AsVariant);
end;

begin
  MyClass<Double>.MyWork(2.4);
  MyClass<string>.MyWork('hello');
  MyClass<Integer>.MyWork(-666);
  Readln;
end.

输出

2.4
你好
-666
于 2013-02-27T13:34:48.670 回答