为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

为什么示例不编译,又如何(共同,反向和反向)方差有效?有人可以在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] }}
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

简而言之,如果允许的话:

  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然后会在运行时抛出一个错误,因为它没有成功转换AnimalDog(duh!)。

一般来说,变异性与协方差和反方差不相符。这就是为什么所有Java集合都是不变的原因。


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 446 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信