我试图测试泛型类型的向量和case类构造函数的输入参数列表之间的相等性。我已经弄清楚如何使用反射来获取参数列表及其类型,但是当对象实例是通用实例时,我无法弄清楚如何测试对象实例和那些类型之间的相等性。
这是一个简化的例子:
abstract class Foo[T]
case class Bar[T](value: Seq[T]) extends Foo[Seq[T]]
def getTypeTag[T: TypeTag](obj: T) = typeTag[T]
// In my use case I have a function that can return any
// Foo, which is why I've used the wildcarded generic here
val bar: Foo[_] = Bar[Int](Seq(2))
// In my use case I actually get the type for a parameter list
// of a case class constructor, but putting this here for simplicity
val bar2 = Bar(Seq(1))
var barType = getType(bar2)
我希望能够测试bar是barType类型的,但这是我能得到的尽可能接近。我不确定如何获得具有指定通用值的类型签名。
scala>runtimeMirror(barClass.getClassLoader).classSymbol(barClass).toType
res112: reflect.runtime.universe.Type = Bar[T]
scala> getType(bar2)
res113: reflect.runtime.universe.Type = Bar[Int]
我对Scala很新(以及一般的JVM反射),所以感谢您的帮助。
答案 0 :(得分:0)
您可以为要使用的所有类型创建特征作为父级,然后使用模式匹配类型在运行时获取正确的对象类型。 Scala具有非常强大的模式匹配功能。
此链接可能有用:http://www.cakesolutions.net/teamblogs/ways-to-pattern-match-generic-types-in-scala