首页 > TAG信息列表 > Contravariance
速懂contravariance, covariane (逆变、协变)
前言 英词成群,非求雅态。固知义足矣,译徒增负也。何以弃译知义,初篇答之。 正文 刚才复习这个知识点,网上都说得很模糊,并且这个特性在很多种语言中都有,我便总结一下。为尽可能照顾广大读者,用Java和Kotlin(JVM)写了示例。示例很简单,如果某些语言Covariance(协变), Contravariance(逆变) and Invariance(不变)
关于类型和子类型之间的关系,关于类型转换,决定方法是被重写还是重载。 只用于泛型接口或委托。 out 协变, 可用派生程度更大的子类替换父类型的参数,只能用于方法的返回值。 in 逆变,可用派生程度更小的父类替换子类型参数,只能用于方法的输入参数。 当是out参数的时候,那么它就要c#-为什么此委托分配不起作用以及如何解决呢?
我有以下示例代码: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.del = this.EventHandler; <-- This does not build } public void EventHandler(object sender, PropertyChangedEventArgC#泛型类型的助记符
我经常忘记在定义协变和逆变泛型类型时是否必须使用in或out.在Java中,我有助记符PECS(生产者扩展了超级用户)来帮助我.您知道c#的类似助记符吗?解决方法:当他们称呼它们为“内”和“外”而不是协变和逆变时,他们不是为我们这样做吗?试想一下:我是在“推高”价值观还是在“推高”价值观java-反向转换番石榴谓词
我有一个谓词< Object>并且需要等价的谓词< Animal>. Predicate<Animal> provideIsSentientPredicate() { // Won't compile -- cannot convert from Predicate<Object> to Predicate<Animal> return Predicates.instanceOf(Human.class); } 谓词为什么不能从受约束的通用集合中推断出接口?
我有一段这样的代码: public IEnumerable<ICacheMember> Flubvert( IEnumerable<ICacheMember> members ) { // do some stuff to members return members; } 但是我对为什么不能这样做感到困惑: public IEnumerable<T> ExecuteFlubversion<T>( IEnuC#协方差和协方差
我有Message1D和Message2D类都从Message继承: public abstract class Message {} public class Message1D : Message {} public class Message2D : Message {} 接口IFoo和实现它的Bar和Baz类: public interface IFoo<out G, in T> where G : Message where T : Messagejava – 逆变方法参数类型
wiki Contravariant_method_argument_type说overriding方法将子类型规则作为函数类型,但除了一个支持逆变量参数类型之外没有其他语言.我也无法想出使用它的任何好处. 例: class AnimalShelter { Animal getAnimalForAdoption() { ... } void putAnimc# – 与泛型的多态性 – 奇怪的行为
可插拔框架 想象一个简单的可插拔系统,使用继承多态非常简单: >我们有一个图形渲染系统 >有不同类型的图形形状(单色,彩色等)需要渲染>渲染由特定于数据的插件完成,例如, ColorRenderer将渲染ColorShape.>每个插件都实现了IRenderer,因此它们都可以存储在IRenderer []中.>启动时,IRec# – 如何使用逆变参数将通用接口转换为基类型?
我正在尝试开发一个通用命令处理器.我想创建实现给定接口的命令处理程序类.我将使用控制反转来根据接收到的命令类型动态创建相应类的实例.然后我想以通用的方式调用类的“Execute”方法. 我能够使用协变类型参数来完成这项工作,但在这种情况下,我不能使用泛型类型参数作为方法参数c# – 似乎无法获得通用协方差/反协方差
假设我有以下代码: public interface IBaseMessage { } public interface IMessageProcessor<in T> where T : IBaseMessage { void Process(T msg); } public class RRMessage : IBaseMessage { //something here } public class BaC#3中具有接口继承(co(ntra) – 方差?)的通用类型推断
我有以下两种通用类型: interface IRange<T> where T : IComparable<T> interface IRange<T, TData> : IRange<T> where T : IComparable<T> ^---------^ |c#Generics“in”关键字
我最近被分配到现有应用程序的一些维护工作.我遇到过以下代码: public interface IEntityService<T, in TKey> { T GetEntityById(TKey id); IEnumerable<T> GetAll(); void Update(T entity); void Delete(TKey key); } 我不确定in关键字对第二个泛c# – 类型不能在泛型类型或方法’BaseController’中用作类型参数’T’.没有隐含的参考
我正在尝试创建一个通用来简化我的代码(它是一个web api项目),但不知何故它最终变得比我预期的更复杂.我想要实现的是这样的: 为了简化我的整个实际代码,这就是我写的: public interface IDatabaseTable { } public class ReceiptIndex: IDatabaseTable { } public interface IBacc# – IComparable作为逆变的好处?
我对方差的经验很少,但在阅读之后我相信至少我理解了基本概念(即方差描述了两种类型的关系和类似投射的这两种类型的关系)之间的关系.但是,我似乎无法掌握IComparable< T>的重要性和好处了.定义为逆变.乍一看,这实际上似乎阻碍了亚型之间的可比性.我希望有人能够对此事有所了解.解