Scala反射类型通用通配符的相等性

时间:2017-03-16 17:34:23

标签: scala generics reflection

我试图测试泛型类型的向量和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反射),所以感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以为要使用的所有类型创建特征作为父级,然后使用模式匹配类型在运行时获取正确的对象类型。 Scala具有非常强大的模式匹配功能。

此链接可能有用:http://www.cakesolutions.net/teamblogs/ways-to-pattern-match-generic-types-in-scala