我有一个MyClass类,它不是通用的,包含并使用任意TList执行某些操作。我希望用通用TList替换TList,但MyClass必须保持非泛型。由于Delphi是不变的,所以这样的东西不起作用:
list1: TList<TObject>
list2: TList<MyType> //MyType extends TObject
[...]
list1 := list2
此外,似乎没有非通用的超级类TList,只有IEnumerable。
有没有办法用TLT声明TList的占位符/通配符?
答案 0 :(得分:4)
这是在Delphi中缺少对Co- and Contravariance的支持的问题。
但是,如果您知道您正在进行协变操作(即迭代列表中的元素),您可以将TList<MyType>
硬编辑为TList<TObject>
,因为MyType
继承自{{1} }}
以维基百科文章中的例子为例,当你只是循环阅读并阅读他们的名字或其他东西时,你可以处理猫的列表,如动物列表。
但是你必须小心那些需要逆转的行为(即添加元素)。
再一次,您不能将狗放入动物列表中,因为实际上该列表是猫的列表。
答案 1 :(得分:0)
答案是否定的,这是不可能做到的。您不能在非泛型类中包含非实例化泛型类型的对象。