我想比较两个类清单(通过implicits得到)来检查类A是否在扩展特征B.下面的代码应该在我询问类是否扩展接口的情况下产生true:
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)
但是,我从终端获得以下输出:
felix@felix-UX32VD:~/Desktop$ scala Test.scala
false
false
(Main$$anon$1@7ad0e999.type#Main$$anon$1$X[Double, Int],Main$$anon$1@7ad0e999.type#Main$$anon$1$Y)
有人可以解释这种行为吗?
答案 0 :(得分:2)
清单的行为被破坏了。这就是它们被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中,我们的想法是弃用Manifest,但由于新反射库的质量尚未达到正确的水平,因此这个想法被拒绝了。这意味着Manifest仍然可以被使用,但是有一个人仍然会想到它们将在某一天从stdlib中删除。
答案 1 :(得分:0)
看起来好像你对ClassManifest
s之间的子类型关系并不感兴趣,而是对擦除类型之间的子类型关系感兴趣。也许这适合你:
println(mX <:< mY) // false
println(mX.erasure.isAssignableFrom(mY.erasure)) // true
println(mY <:< mX) // false
println(mY.erasure.isAssignableFrom(mX.erasure)) // false