继这个问题之后,有人可以在Scala中解释以下内容:
class Slot[+T] (var some: T) {
// DOES NOT COMPILE
// "COVARIANT parameter in CONTRAVARIANT position"
}
Run Code Online (Sandbox Code Playgroud)
我明白之间的区别+T,并T在类型声明(它编译如果我使用T).但是,如何实际编写一个在其类型参数中具有协变性的类而不依赖于创建未参数化的东西?如何确保只能使用实例创建以下内容T?
class Slot[+T] (var some: Object){
def get() = { some.asInstanceOf[T] }
}
Run Code Online (Sandbox Code Playgroud)
编辑 - 现在得到以下内容:
abstract class _Slot[+T, V <: T] (var some: V) {
def getT() = { some }
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但我现在有两个类型参数,我只想要一个.我会再问这个问题:
如何编写一个在其类型中具有协变性的不可变 Slot类?
编辑2:呃!我用过var而不是val.以下是我想要的:
class Slot[+T] (val some: …Run Code Online (Sandbox Code Playgroud) IEnumerable<T>是共变体,但它不支持值类型,仅支持引用类型.以下简单代码编译成功:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Run Code Online (Sandbox Code Playgroud)
但是从更改string到int将得到编译错误:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
Run Code Online (Sandbox Code Playgroud)
原因在MSDN中解释:
差异仅适用于参考类型; 如果为变量类型参数指定值类型,则该类型参数对于生成的构造类型是不变的.
我搜索过并发现有些问题提到的原因是值类型和引用类型之间的装箱.但它仍然不清楚我的想法为什么拳击是什么原因?
有人可以给出一个简单而详细的解释为什么协方差和逆变不支持值类型以及拳击如何影响这个?
我无法理解为什么以下C#代码无法编译.
正如您所看到的,我有一个静态泛型方法Something with a IEnumerable<T>parameter(并且T被约束为一个IA接口),并且此参数不能隐式转换为IEnumerable<IA>.
解释是什么?(我不寻找解决方法,只是为了解它为什么不起作用).
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>()); …Run Code Online (Sandbox Code Playgroud) 今天,我在Java中阅读了一些关于Covariance,Contravariance(和Invariance)的文章.我阅读了英文和德文维基百科的文章,以及IBM的一些其他博客文章和文章.
但我对这些究竟是什么有点困惑?有人说,它是关于类型和子类型之间的关系,也有人说,它是关于类型转换和一些说,它是用来决定一个方法是否重载或超载.
所以我正在用简单的英语寻找一个简单的解释,它向初学者展示了Covariance和Contravariance(和Invariance).加上一点简单的例子.
我没有参加PDC 2008,但我听到一些消息称C#4.0被宣布支持Generic协方差和反差异.也就是说,List<string>可以分配给List<object>.怎么会这样?
在Jon Skeet的C#深度书中,解释了为什么C#泛型不支持协方差和反方差.它主要用于编写安全代码.现在,C#4.0改为支持它们.它会带来混乱吗?
有人知道有关C#4.0的细节可以给出一些解释吗?
我在C#上阅读的教科书中遇到过这些,但我很难理解它们,可能是由于缺乏背景.
是否有一个很简洁的解释,说明它们是什么以及它们对那里有用的东西?
编辑以澄清:
协变界面:
interface IBibble<out T>
.
.
Run Code Online (Sandbox Code Playgroud)
逆变接口:
interface IBibble<in T>
.
.
Run Code Online (Sandbox Code Playgroud) 我知道类型的协方差和逆变.我的问题是为什么我在Haskell的研究中没有遇到过这些概念的讨论(与Scala相反)?
看起来Haskell查看类型的方式与Scala或C#相比存在根本区别,我想阐明这种区别是什么.
或者也许我错了,我还没有学到足够的Haskell :-)
我只是想了解extendsJava Generics中的关键字.
List<? extends Animal>意味着我们可以在任何东西对象List这是阿 Animal
那么以下也不会意味着同样的事情:
List<Animal>
Run Code Online (Sandbox Code Playgroud)
有人能帮助我了解上述两者之间的区别吗?对我来说extends这里听起来多余.
谢谢!