2012-11-14 80 views
1

我想比較兩個類的清單(通過implicits得到)來檢查類A是否擴展了特性B.下面的代碼應該在我詢問類是否擴展接口:在Scala中檢查ClassManifest的子類型

trait X[T,S] 

class Y extends X[Double,Int] 


val mX = implicitly[ClassManifest[X[Double,Int]]] 
val mY = implicitly[ClassManifest[Y]] 

println(mX <:< mY) 

println(mY <:< mX) 

println(mX,mY) 

不過,我從終端輸出如下:

[email protected]:~/Desktop$ scala Test.scala 
false 
false 
([email protected]#Main$$anon$1$X[Double, Int],[email protected]#Main$$anon$1$Y) 

有人能解釋這種現象?

回答

2

Manifests的行爲被打破。這就是爲什麼他們在2.10替換TypeTags的原因,這是直接對基礎類型的工作:

scala> typeTag[Y].tpe <:< typeTag[X[Double,Int]].tpe 
res21: Boolean = true 

scala> typeOf[Y] <:< typeOf[X[Double,Int]] 
res22: Boolean = true 

在2.10想法是棄用使用艙單,但由於新的反射庫的質量目前還沒有達到正確的水平,這個想法被拒絕了。這意味着Manifests仍然可以使用,但是仍然有人留意到他們有一天會從stdlib中刪除。

+0

想象我的眼淚,因爲我剛剛完成添加class-manifests到我的特質和一堆實施類:'(哦,上帝......好吧,至少現在我可以通過時間明天:/ – Felix

+1

在2.10.0清單並不過時,因爲反射結束了實驗我們計劃雖然棄用體現,當反射變得足夠拋光。 –

+0

@EugeneBurmako:是的,我錯過了感謝澄清 – sschaef

0

它看起來好像對ClassManifest之間的子類型關係實際上並不感興趣,而是對擦除類型之間的子類型關係感興趣。也許這適用於你:

println(mX <:< mY) // false 
println(mX.erasure.isAssignableFrom(mY.erasure)) // true 

println(mY <:< mX) // false 
println(mY.erasure.isAssignableFrom(mX.erasure)) // false 
+0

謝謝你的回答,但我必須去sschaefs的答案,因爲它是更「推動」我:) – Felix