为什么示例不编译,又如何(共同,反向和反向)方差有效?

为什么示例不编译,又如何(共同,反向和反向)方差有效?

有人可以在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] }}


慕田峪4524236
浏览 447回答 3
3回答

largeQ

简而言之,如果允许的话:  class Slot[+T](var some: T) {     def get: T = some      }   val slot: Slot[Dog] = new Slot[Dog](new Dog)      val slot2: Slot[Animal] = slot  //because of co-variance    slot2.some = new Animal   //legal as some is a var   slot.get ??slot.get然后会在运行时抛出一个错误,因为它没有成功转换Animal为Dog(duh!)。一般来说,变异性与协方差和反方差不相符。这就是为什么所有Java集合都是不变的原因。
打开App,查看更多内容
随时随地看视频慕课网APP