作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我试图从网上的几篇文章和 StackOverflow 上的问题中找出 Covariance
和 Contravariance
这两个词的确切含义,据我所知,这只是多态性的另一种说法。
我上面的说法正确吗?还是我听错了?
最佳答案
肯定和多态有关。不过,我不会说它们只是多态性的“另一个词”——它们是关于非常具体的情况,在这种情况下,您可以将一种类型视为另一种类型在特定上下文中。
例如,使用正常的多态性,您可以处理对 Banana
的任何引用作为对 Fruit
的引用- 但这并不意味着您可以替代 Fruit
每次 当您看到 Banana
类型时.例如,List<Banana>
不能被视为 List<Fruit>
因为list.Add(new Apple())
适用于 List<Fruit>
但不适用于 List<Banana>
.
协变允许在 API 中替换“更大”(不太具体)的类型,其中原始类型仅用于“输出”位置(例如作为返回值)。逆变允许在 API 中替换“更小”(更具体)的类型,其中原始类型仅用于“输入”位置。
很难在单个 SO 帖子中详细介绍所有细节(尽管希望其他人能做得比这更好!)。埃里克·利珀特 (Eric Lippert) 拥有出色的 series of blog posts关于它。
关于C# : Is Variance (Covariance/Contravariance) another word for Polymorphism?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1078423/
我是一名优秀的程序员,十分优秀!