如果要设计像ILookup这样的接口(为了简单起见,假设它只是ICheckIfContained,所以项值的类型并不重要),相对于第一个参数,理想的方差类型是什么?
检查ICheckIfContained<Animal>是否包含特定的Cat将是一种自然操作,并且在正常的逆变规则下是类型安全的。
在正常的逆变规则下,检查ICheckIfContained<Cat>是否包含特定的Animal不是类型安全的,而是自然且定义良好的(如果有问题的Animal不是Cat,正确的行为应该是ICheckIfContained说它不包含有问题的动物)。
检查ICheckIfContained<Cat>是否包含特定的Dog并不是特别有用(答案总是“否”),但答案将是明确的。请注意,与前一个场景不同的是,此场景中的答案可以静态确定。
一种方法是让ICheckIfContained成为非泛型接口,并简单地接受Object类型的参数。然而,当列表只包含一种类型的结构时,这似乎是相当低效的。另一方面,如果它是一个泛型接口,那么编译器将不能允许在协变场景中使用它(传递一个参数,该参数的声明类型是预期类型的父类型,以便传入的对象可能是预期类型,也可能不是预期类型)。
在编译器可以确认所有东西都是同一类型的情况下,是否有什么好的模式可以获得泛型的效率,同时仍然允许检查父类型的对象是否在子类型的集合中的一般情况行为?
发布于 2011-11-20 06:41:03
我认为你不能那样做。能够将其静态检查为false肯定是有效的,但只有当编译器确切地知道此方法执行的是哪种操作时,才能优化将Dog传递给Contains(cat)。
如果你的Contains实际上是Add呢?编译器不理解方法名称。
https://stackoverflow.com/questions/8196876
复制相似问题