IFeedable<Dog> feedDog = new FeedImp<Animal>();
上面的代码将FeedImp<Animal>类型赋值给了IFeedable<Dog>的变量;Animal向Dog转变了,所以是逆变
2.泛型接口中的协变
如下接口的定义:
复制代码 代码如下:
public interface IFinder<out T>
{
T Find();
}
泛型接口的泛型T之前用了out关键字来说明此接口是可能要做协变的;如下泛型接口实现类
复制代码 代码如下:
public class Finder<T>:IFinder<T> where T:new()
{
public T Find(){
return new T();
}
}
//使用协变,IFinder的泛型类型是Animal,但是由于有out关键字,我可以将Finder<Dog>赋值给它
IFinder<Animal> finder = new Finder<Dog>();
协变和逆变的概念不太容易理解,可以通过实际代码思考理解。这么绕的东西到底有用吗?答案是肯定的,通过协变和逆变可以更好的复用代码。复用是软件开发的一个永恒的追求。