天天看點

scala的類與類型

list<string>和list<int>類型是不一樣的,但是jvm運作時會采用泛型擦除。導緻list<string>和list<int>都是class<list>.為了得到正确的類型,需要通過反射。

java中的泛型基本上都是在編譯器這個層次來實作的。在生成的java位元組碼中是不包含泛型中的類型資訊的。使用泛型的時候加上的類型參數,會在編譯器在編譯的時候去掉。這個過程就稱為類型擦除。泛型擦除是為了相容jdk1.5之前的jvm,在這之前是不支援泛型的。

上面顯示了兩者的不同,getclass 方法得到的是 class[a]的某個子類,而 classof[a] 得到是正确的 class[a],但是去比較的話,這兩個類型是equals為true的

classof擷取運作時的類型。classof[t] 相當于 java中的t.class

而getclass:

這種細微的差别,展現在類型指派時,因為java裡的 class[t]是不支援協變的,是以無法把一個 class[_ < : a] 指派給一個 class[a]

<code>類(class)與類型(type)是兩個不一樣的概念</code>

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

類型一緻的對象它們的類也是一緻的,反過來,類一緻的,其類型不一定一緻。

classtag[t]儲存了被泛型擦除後的原始類型t,提供給運作時的。

typetag則儲存所有具體的類型

可以看到,擷取到的類型是具體的類型,而不是被擦除後的類型list(any)

<a target="_blank" href="http://hongjiang.info/scala-type-system-classof-and-getclass/">http://hongjiang.info/scala-type-system-classof-and-getclass/</a>

<a target="_blank" href="http://hongjiang.info/scala-type-and-class/">http://hongjiang.info/scala-type-and-class/</a>

<a target="_blank" href="http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.reflect.classtag">http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.reflect.classtag</a>

<a target="_blank" href="http://blog.csdn.net/lonelyroamer/article/details/7868820">http://blog.csdn.net/lonelyroamer/article/details/7868820</a>