任意通用List的通配符

时间:2014-03-14 12:15:08

标签: delphi generics delphi-xe5

我有一个MyClass类,它不是通用的,包含并使用任意TList执行某些操作。我希望用通用TList替换TList,但MyClass必须保持非泛型。由于Delphi是不变的,所以这样的东西不起作用:

list1: TList<TObject>
list2: TList<MyType> //MyType extends TObject
[...]
list1 := list2

此外,似乎没有非通用的超级类TList,只有IEnumerable。

有没有办法用TLT声明TList的占位符/通配符?

2 个答案:

答案 0 :(得分:4)

这是在Delphi中缺少对Co- and Contravariance的支持的问题。 但是,如果您知道您正在进行协变操作(即迭代列表中的元素),您可以将TList<MyType>硬编辑为TList<TObject>,因为MyType继承自{{1} }}

以维基百科文章中的例子为例,当你只是循环阅读并阅读他们的名字或其他东西时,你可以处理猫的列表,如动物列表。

但是你必须小心那些需要逆转的行为(即添加元素)。

再一次,您不能将狗放入动物列表中,因为实际上该列表是猫的列表。

答案 1 :(得分:0)

答案是否定的,这是不可能做到的。您不能在非泛型类中包含非实例化泛型类型的对象。