Tag: 协方差

将List <DerivedClass>转换为List <BaseClass>

虽然我们可以从基类/接口inheritance,但为什么我们不能使用相同的类/接口声明一个List<> ? interface A { } class B : A { } class C : B { } class Test { static void Main(string[] args) { A a = new C(); // OK List<A> listOfA = new List<C>(); // compiler Error } } 有没有办法?

C#方差问题:分配List <Derived>作为List <Base>

看下面的例子(部分来自MSDN博客 ): class Animal { } class Giraffe : Animal { } static void Main(string[] args) { // Array assignment works, but… Animal[] animals = new Giraffe[10]; // implicit… List<Animal> animalsList = new List<Giraffe>(); // …and explicit casting fails List<Animal> animalsList2 = (List<Animal>) new List<Giraffe>(); } 这是一个协变问题吗? 这将在未来的C#版本中得到支持,是否有任何聪明的解决方法(只使用.NET 2.0)?

为什么数组是协变的,但泛型是不变的?

来自Joshua Bloch的Effective Java, 数组在两个重要方面与泛型不同。 第一个数组是协变的。 泛型是不变的。 协变简单地意味着如果X是Y的子类型,那么X []也将是Y []的子类型。 数组是协变的因为字符串是Object So的子类型 String[] is subtype of Object[] 不变简单地意味着不管X是否是Y的子类型, List<X> will not be subType of List<Y>. 我的问题是为什么决定在Java中使数组协变? 还有其他的SO帖子,比如为什么数组是不变的,但是列表是协变的? ,但他们似乎集中在斯卡拉,我不能遵循。

为什么这个例子没有编译,又如何(合作,对立和in)方差工作?

继这个问题之后 ,有人可以在Scala中解释以下内容: class Slot[+T] (var some: T) { // DOES NOT COMPILE // "COVARIANT parameter in CONTRAVARIANT position" } 我理解类型声明中的+T和T之间的区别(如果我使用T则编译它)。 但是如何在没有参数化的情况下写一个类型参数协变的类呢? 我怎样才能确保以下只能创建一个T的实例? class Slot[+T] (var some: Object){ def get() = { some.asInstanceOf[T] } } 编辑 – 现在把它归结为以下内容: abstract class _Slot[+T, V <: T] (var some: V) { def getT() = { some } } 这一切都很好,但我现在有两个类型参数,我只想要一个。 […]