第50講:Scala中Variance變化點

王家林親授《DT大數據夢工廠》大數據實戰視頻 Scala 深刻淺出實戰經典(1-64講)完整視頻、PPT、代碼下載:
百度雲盤:http://pan.baidu.com/s/1c0noOt6
騰訊微雲:http://url.cn/TnGbdC
360雲盤:http://yunpan.cn/cQ4c2UALDjSKy 訪問密碼 45e2
土豆:http://www.tudou.com/programs/view/85BX4YBSdSI/
優酷:http://v.youku.com/v_show/id_XMTI4MjU5NjIyMA==.html?from=s1.8-1-1.2
愛奇藝:http://www.iqiyi.com/w_19rrxj6hmh.html#vfrm=2-3-0-1
騰訊視頻: http://v.qq.com/boke/page/y/0/j/y0159g6di6j.html
技術愛好者尤爲是大數據愛好者 能夠加DT大數據夢工廠的qq羣html

DT大數據夢工廠① :462923555
DT大數據夢工廠②:437123764
DT大數據夢工廠③ :418110145java

微信公衆帳號: DT_Spark
王家林老師微信號: 18610086859
王家林老師QQ: 1740415547
王家林老師郵箱: 18610086859@126.com微信

本視頻由王家林老師, 親自講解, 徹底經過代碼實戰把您帶人大數據的時代.函數

package com.parllay.scala.oop

/**
* Created by richard on 15-8-4.
* 第50講:Scala中Variance變化點
*/

class Animal
class Bird extends Animal
class Chicken extends Animal

class Pair22[+T](var p: T){
//def haveLegs(p1: T) = println("")
}

object Variance_Point {

/**
根據Liskov替換原則,若是A是B的子類,那麼能適用於B的全部操做,都適用於A。
讓咱們看看這邊Function1的定義,是否知足這樣的條件。
假設Bird是Animal的子類,那麼看看下面兩個函數之間是什麼關係:

def f1(x: Bird): Animal // instance of Function1[Bird, Animal]
def f2(x: Animal): Bird // instance of Function1[Animal, Bird]
在這裏f2的類型是f1的類型的子類。爲何?

咱們先看一下參數類型,根據Liskov替換原則,f1可以接受的參數,f2也能接受。
在這裏f1接受的Bird類型,f2顯然能夠接受,由於Bird對象能夠被當作其父類Animal的對象來使用。

再看返回類型,f1的返回值能夠被當作Animal的實例使用,f2的返回值能夠被當作Bird的實例使用,
固然也能夠被當作Animal的實例使用。

因此咱們說,函數的參數類型是逆變的,而函數的返回類型是協變的。

那麼咱們在定義Scala類的時候,是否是能夠隨便指定泛型類型爲協變或者逆變呢?答案是否認的。
經過上面的例子能夠看出,若是將Function1的參數類型定義爲協變,或者返回類型定義爲逆變,
都會違反Liskov替換原則,所以,Scala規定,協變類型只能做爲方法的返回類型,
而逆變類型只能做爲方法的參數類型。類比函數的行爲,結合Liskov替換原則,
就能發現這樣的規定是很是合理的。
* @param args
*/
def main(args: Array[String]) {

}

}
相關文章
相關標籤/搜索