日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

scala 上界 <:, 下界>:, 视界 <%, 边界 :, 协变 +T, 逆变-T

發布時間:2024/3/13 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scala 上界 <:, 下界>:, 视界 <%, 边界 :, 协变 +T, 逆变-T 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

上界 (<:) 下界(>:) 是類型約束范疇,用來約束對象的子類是誰,父類是誰
協變 (+T) 逆變(-T)是泛型范疇,主要用于集合類型變量賦值。
視界 (<%) 邊界( :)是隱式調用的簡寫。

上界 (<:) 下界(>:)

上界:要求對象必須是某一個對象的子類,因為子類會繼承父類的屬性和方法,所以父類的方法和屬性這路都可以用。

trait A {def func()}class B extends A {override def func(): Unit = {println("i am b")}}class C extends A {override def func(): Unit = {println("i am c")}}def test[T <: A](obj: T): Unit = {obj.func()}test(new B()) // i am btest(new C()) // i am c

下界:要求對象必須是某一個對象的父類。主要用在已知某一個具體類型,但是要給它賦值給另一個變量,該變量必須是具體類型的父類型才行。

舉例:
對于下面的例子,我們要把元素B放到一個集合中,這個集合必須是類型B父類容器才行。這里就是B是已知類型,集合類型未知。

trait A {def func()}class B extends A {override def func(): Unit = {println("i am b")}}def add[T >: B](list: collection.mutable.Set[T], elem: B): collection.mutable.Set[T] = {list.add(elem)list}

協變 (+T) 逆變(-T)

逆變協變指的是類型T和包裝類型直接的關系。
有兩個類如下所示:

trait A {def func()}class B extends A {override def func(): Unit = {println("i am b")}}

假設有個包裝類型F[T]

class F[T]

現在我們生產一個F[B]實例,然后賦值給F[A]類型的變量.就會報錯。因為F[B]并不是F[A]的子類。

val a:F[A] = new F[B]() // error

所以這個時候才會需要逆變和協變。
協變:子類的包裝類型也是父類包裝類型的子類

class F[+T] // 協變val a: F[A] = new F[B]() // 正確

逆變:子類的包裝類型是父類包裝類型的父類

class G[-T] // 逆變val b: G[B] = new G[A]() // 正確

一個比較經典的例子是:scala 函數的定義.scala中所有的函數,參數都是逆變的,返回值都是協變的。 trait Function[-T1,+T2].也就是說一個函數要賦值給一個函數類型變量。這個函數的參數必須是函數變量參數的父類,返回值必須是函數變量返回值的子類。

trait A {def func()}class B extends A {override def func(): Unit = {println("i am b")}}class C extends B {}val func: B => B = (a: A) => { new C() } // 把 A=>C類型的函數賦值給B=>B類型的變量

視界 <%, 邊界 :

視圖和邊界看到的比較多,但是功能比較強大,也容易被誤解。比如 ( : )就經常會被誤以為是上界和下屆的一種。

視界 <%

視界只是一種隱式類型函數的簡寫。如果我們需要一個Fruits類型的隱式參數,但是我們只有一個 T 類型,這時就可以用視界。他要求想使用這個函數,必須提供一個由T => Fruits的隱式調用。 比如下面:

scala> case class Fruits(name: String) defined class Fruitsscala> def getFruits[T <% Fruits](value: T): Fruits = value getFruits: [T](value: T)(implicit evidence$1: T => Fruits)Fruits等價于scala> def getFruits[T](value: T)(implicit evidence: T => Fruits): Fruits = evidence(value) getFruits: [T](value: T)(implicit evidence: T => Fruits)Fruits

邊界 :

邊界相對來將應用場景比較多一些。下面有個函數anothr,需要一個隱式參數。我們在func中調用了這個方法,但是我們并沒有提供隱式參數。這就和視圖有點類似了。在視圖中要求傳入一個隱式函數,但這里是要求傳入一個隱式類型。

class F[T]def another[T](elem: T)(implicit f: F[T]) = {// do nothing }def func[T: F](elem: T): Unit = {another(elem) }scala> def func[T: F](elem: T): Unit = {another(elem)}func: [T](elem: T)(implicit evidence$1: F[T])Unit // 使用 scala> func(1)(new F[Int]()) 或則 scala> func(1)(new F()) //自行推斷

有一個比較經典的例子,利用這個方法可以實現隱式泛型

import scala.reflect.runtime.universe._typeOf函數需要傳入一個隱式類型TypeTag[T] // def typeOf[T](implicit ttag: TypeTag[T]): Type = ttag.tpedef getTypeTag[T: TypeTag](obj: T) = typeOf[T] // 我們調用的時候也沒有傳入隱式類型,因為scala運行環境中會自定存儲。 getTypeTag(1)

總結

以上是生活随笔為你收集整理的scala 上界 <:, 下界>:, 视界 <%, 边界 :, 协变 +T, 逆变-T的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美国色视频 | 日本少妇激情 | 黑人巨大猛交丰满少妇 | 久久澡 | 一区二区不卡视频 | 在线免费看av的网站 | 日日麻批免费视频播放 | 中文视频一区二区 | 午夜国产福利 | 午夜影视福利 | 亚洲最大网 | 美女试爆场恐怖电影在线观看 | jlzzjlzz亚洲女人18 | 色婷婷97| 国产91丝袜 | 99re在线精品| 日韩激情一区二区三区 | 日本a在线观看 | 114国产精品久久免费观看 | 日日艹| 欧美日韩成人免费观看 | wwwxxx在线观看 | 亚洲黄色免费看 | 亚洲精品国产a | 自拍日韩亚洲一区在线 | xxxx黄色| 伊人天堂av| 无码一区二区波多野结衣播放搜索 | 久久99精品久久久久 | 欧美激情欧美激情在线五月 | 欧美色图网址 | 中国女人黄色大片 | 大奶子在线观看 | 亚洲精品视频在线播放 | 无码人妻aⅴ一区二区三区有奶水 | 国产亚洲高清视频 | 日韩精品一区二区三区在线 | 深夜视频在线看 | 日本a级片网站 | 超碰蜜桃 | 女同性做受全过程动图 | 亚洲va中文字幕 | 亚洲啪啪网 | 嫩草影院中文字幕 | 调教一区二区三区 | 国产伦精品一区二区三区妓女 | 毛片av在线播放 | 欧美精品一区二区在线播放 | 日日夜夜伊人 | 夫の上司に犯波多野结衣853 | 人与动物黄色片 | 精品国产乱码久久久久久蜜臀 | 精品乱码久久久久久中文字幕 | 成年视频在线观看 | 夜夜操夜夜操 | 日韩精品123 | 18色av| 夜夜嗨aⅴ一区二区三区 | 素人fc2av清纯18岁 | 无码精品久久久久久久 | 无码国产精品96久久久久 | 欧美精品黄色 | 禁断介护老人中文字幕 | 欧美性猛交xxxx乱大交俱乐部 | 色综合av在线 | 深夜成人福利 | 国产成人精品在线视频 | 黄色片网站免费在线观看 | 伊人久久一区 | 女性生殖扒开酷刑vk | 99久久久国产精品无码性 | 免费吃奶摸下激烈视频 | 97精品人妻一区二区 | 午夜国产在线 | 色哟哟在线观看 | 九色porny丨精品自拍视频 | 亚洲精品999 | 一区二区三区不卡视频 | 成人里番精品一区二区 | a级片一级片 | 午夜一二三区 | 欧美激情首页 | 在线亚洲网站 | 久久久久久综合网 | 成全影视在线观看第8季 | 亚洲AV无码一区二区伊人久久 | 欧美极品在线 | 777精品久无码人妻蜜桃 | 在线看黄网站 | 超碰77| 日本视频一区二区 | 亚洲精久 | 日日夜夜免费精品 | 青青色在线视频 | 一本在线 | 婷婷伊人五月天 | 国产精品无码内射 | 精品一区二区在线视频 | 久久激情影院 |