检查ClassManifest中Scala中的子类型

时间:2012-11-14 16:49:48

标签: scala manifest implicit subtype

我想比较两个类清单(通过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)

有人可以解释这种行为吗?

2 个答案:

答案 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