在Scala中检查类清单中的子类型

在Scala中检查类清单中的子类型,scala,manifest,implicit,subtype,Scala,Manifest,Implicit,Subtype,我想比较两个类清单(通过隐式获得)来检查类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) p

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

有人能解释这种行为吗?

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

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

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

println(mX清单的行为被破坏。这就是为什么清单被2.10所取代的原因,它直接作用于底层类型:

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

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

scala>typeTag[Y].tpe-typeOf[Y]谢谢你的回答,但我不得不接受sschaefs的回答,因为它对我来说更“推动”:)想象一下,当我刚刚完成向我的trait和一堆实现类添加类清单时,我的眼泪:'(哦,上帝……好吧,至少现在我明天可以消磨时间了:/2.10.0中的清单没有被否决,因为反射最终是实验性的。不过,我们确实计划在反射变得足够完美的时候否决清单。@EugeneBurmako:是的,我错过了。谢谢你的澄清。搜索+替换对我来说走了很长一段路:)我现在已经用TypeTags实现了我的程序,它甚至可以与泛型一起工作:)你们能告诉我多个上下文边界是否是新的吗?我看到另一篇文章以这样的方式使用泛型函数:func[T:Numeric:TypeTag],这有点酷!此外,我是否总是需要导入TypeTag和typeOf函数?在2.10中,多个上下文边界不是新的,是的,您总是必须导入所需的类型。也许在将来,当反射和宏不再是实验性的时,一些类型将被添加到Predef中,以使它们的处理更容易。
scala> typeTag[Y].tpe <:< typeTag[X[Double,Int]].tpe
res21: Boolean = true

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