1

我想比较两个类清单(通过隐式获得)以检查类 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)

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

4

2 回答 2

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 的想法是弃用 Manifests,但由于新反射库的质量还没有达到正确的水平,这个想法被拒绝了。这意味着 Manifests 仍然可以使用,但人们仍然记得有一天它们会从 stdlib 中删除。

于 2012-11-14T18:42:57.050 回答
0

看起来您实际上并不对ClassManifests 之间的子类型关系感兴趣,而是对已擦除类型之间的子类型关系感兴趣。也许这对你有用:

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

println(mY <:< mX) // false
println(mY.erasure.isAssignableFrom(mX.erasure)) // false
于 2012-11-14T16:54:37.367 回答