Scala深入浅出进阶经典 第49讲:Scala中Variance代码实战及其在Spark中的应用源码解析

package com.dt.scalaInAction.demo_049

/**
 * Scala中Variance代码实战及其在Spark中的应用源码解析
 * 
 * 通俗讲
 * B是A的子类 ==>List[B]是List[A]的子类(与具体元素的继承关系同向)  这样称之为"协变"  
 * B是A的子类 ==>List[A]是List[B]的子类(与具体元素的继承关系反向)  这样称之为"逆变"  
 * 如果支持上面的这种概念 就被称之为"Variance" 否则称之为"inVariance"
 * 
 * 事实上Java不支持在定义一个类型时声明为这样的"Variance"
 * e.g. String是object的子类 List<String> 却不是 List<Object>的子类
 * 但是Java中是存在这样的痕迹的 比如:
 * List<? extends Object> list = new ArrayList<String>()
 * 在Scala中也是可以向上面这样写的:
 * val list: List[_ <: Any] = List[String]("Spark", "Hadoop")
 * 
 * 事实上Java支持在使用的时候 可以这样去定义,在声明的时候不支持,但是Scala中的可以
 * 
 * Scala中 在声明时留意表达这种Variance的关系
 * 形如class C[+T] “+”表示"协变" 也就是说若B为A的子类型 则C[B]是C[A]的子类型
 *    class C[-T] “-”表示"协变" 也就是说若B为A的子类型 则C[A]是C[B]的子类型
 *    
 */
class Person
class Student extends Person
class C[+T] (val args: T)
//注意:C类型是支持"协变"的 C的子类型S也必须是支持"协变"的
class S[+T](args: T) extends C[T](args)

trait Friend[-T]{
    def makeFriend(someBody: T)
}

object Variance {
    def makeFriendWithYou(s: Student, f: Friend[Student]){f.makeFriend(s)}
    def main(args: Array[String]): Unit = {
        val value: C[Person] = new C[Student](new Student)
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值