【发布时间】:2013-07-19 11:05:11
【问题描述】:
我正在尝试测试两个“容器”是否使用相同的高级类型。看下面的代码:
import scala.reflect.runtime.universe._
class Funct[A[_],B]
class Foo[A : TypeTag](x: A) {
def test[B[_]](implicit wt: WeakTypeTag[B[_]]) =
println(typeOf[A] <:< weakTypeOf[Funct[B,_]])
def print[B[_]](implicit wt: WeakTypeTag[B[_]]) = {
println(typeOf[A])
println(weakTypeOf[B[_]])
}
}
val x = new Foo(new Funct[Option,Int])
x.test[Option]
x.print[Option]
输出是:
false
Test.Funct[Option,Int]
scala.Option[_]
但是,我希望一致性测试能够成功。我究竟做错了什么?如何测试更高种类的类型?
澄清
就我而言,我正在测试的值(示例中的 x: A)出现在宏中的 List[c.Expr[Any]] 中。所以任何依赖静态分辨率的解决方案(就像我给出的那样)都不能解决我的问题。
【问题讨论】:
-
支持您的期望:
implicitly[Funct[Option,Int] <:< Funct[Option,_]] -
来自gist.github.com/xeno-by/6054650 我可以看到类型修饰符没有看到 B 的类型标记,所以你没有从weakTypeOf[Funct[B, _]] 中得到正确的类型。
-
好的,现在我知道问题出在哪里了。这又是类型参数定义和其他地方使用的下划线之间的混淆。
TypeTag[B[_]]中的下划线表示存在类型,因此您得到的类型标记不是B,而是存在于它的包装器。因此typeOf[Funct[B, _]]无法使用此类型标签并感到不安。 -
@EugeneBurmako 对我来说非常有意义。但是我不允许写
WeakTypeTag[B](B带类型参数)。此外,weakTypeOf[Funct[B, _]]确实使用了WeakTypeTag。如果我不提供隐含的WeakTypeTag[B[_]],它将失败。 -
发布了带有解决方法的答案。
标签: scala reflection types