91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用scala classOf、typeOf、object

發布時間:2021-10-09 15:34:25 來源:億速云 閱讀:186 作者:iii 欄目:編程語言

本篇內容介紹了“如何使用scala classOf、typeOf、object”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

java里 jvm在運行時采用類型擦拭的做法,類型已經不能單純的用class來區分了,比如 List 和 List 的class 都是 Class,然而兩者類型(type)卻是不同的。

在Scala里,類型系統又比java復雜很多,它自己提供了一個scala.reflect.runtime.universe.Type

在scala用typeOf獲取類型信息:

scala> import scala.reflect.runtime.universe._

scala> class A

scala> typeOf[A]

res44: reflect.runtime.universe.Type = A

同樣scala里獲取類(Class)信息也很便捷:

scala> classOf[A]

另外,因為 java 的Object里提供了getClass方法,對于scala 對象來說,也可以用

scala> val a = new A

scala> a.getClass

res53: Class[_ <: A] = class A

注意,typeOf 和 classOf 方法接收的都是類型符號,并不是對象實例

scala> object O

scala> classOf[O] // 這里O是一個單例對象,是一個實例

:14: error: not found: type O

對于實例,要獲取他的 Class 信息,只有通過 getClass 方法

scala> O.getClass

res60: Class[_ <: O.type] = class O$

注意到了,上面的 單例對象O 對應的class是 O$ ,你通過 :javap O 也能看到這個單例反編譯后是一個名為O$的 java class

看上面的返回類型里 用:O.type 表示其類型;實際上 .type之前的都可以看做是一種類型路徑,每個實例都可以通過.type方式表達它的單例類型

再舉一個例子:

scala> class A { class B }  // 嵌套類

scala> val a1 = new A

scala> val a2 = new A

scala> val b1 = new a1.B

scala> val b2 = new a2.B

對于內部類B的實例,它們的class都是相同的: A$B(表示B是A的內部類)

scala> b1.getClass

res8: Class[_ <: a1.B] = class A$B

scala> b1.getClass == b2.getClass

res7: Boolean = true

而它們的類型卻是不同的:

scala> typeOf[a1.B] == typeOf[a2.B]

res10: Boolean = false 

這是因為內部類型依賴外部實例(路徑依賴類型),外部實例不同,它們也不同。

但還可以對這種類型再抽象

scala> typeOf[a1.B] <:< typeOf[A#B]

res11: Boolean = true

scala> typeOf[a2.B] <:< typeOf[A#B]

res12: Boolean = true

這里A#B涉及到類型投影的概念,如前所講。

簡單的說,類(class)與類型(type)是兩個不一樣的概念 (在java里因為早期一直使用class表達type,并且現在也延續這樣的習慣);類型(type)比類(class)更”具體”,任何數據都有類型。類是面向對象系統里對同一類數據的抽象,在沒有泛型之前,類型系統不存在高階概念,直接與類一一映射,而泛型出現之后,就不在一一映射了。比如定義class List[T] {}, 可以有List[Int] 和 List[String]等具體類型,它們的類是同一個List,但類型則根據不同的構造參數類型而不同。

scala> classOf[List[Int]] == classOf[List[String]](類型擦除)

res16: Boolean = true

scala> typeOf[List[Int]] == typeOf[List[String]]

res17: Boolean = false

在jvm里,類的實例都是引用形式,而類型沒有這個約束,基礎類型int,byte,char等就是非引用的。類型比類更“具體”,更“細”一些。

“如何使用scala classOf、typeOf、object”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

工布江达县| 郧西县| 高陵县| 舒兰市| 安阳市| 通辽市| 南雄市| 荣昌县| 华蓥市| 黔西县| 兴业县| 四会市| 宁阳县| 正定县| 大同市| 镇江市| 共和县| 永兴县| 延寿县| 岫岩| 连城县| 江华| 潢川县| 东辽县| 新乡县| 班戈县| 明溪县| 红河县| 姚安县| 惠水县| 二连浩特市| 江油市| 措勤县| 沾益县| 陆川县| 常宁市| 商丘市| 化隆| 乌拉特中旗| 邵阳市| 夏邑县|