具有上限类型绑定的类型别名的TypeTag

时间:2014-06-20 14:53:29

标签: scala reflection types scala-2.10

我试图获取一个类型别名的TypeTag,其类型别名在库类中具有上限类型。 (简化)库代码如下所示:

abstract class A {
  trait B
  type T <: B
  def newT: T
}
object A {
  def apply() = new A {
    class B2 extends B
    type T = B2
    def newT = new B2
  }
}
class E[T: TypeTag](x: T)

在REPL上我正在做:

val a = A()
val t = a.newT
val e = new E(t)

我回来了#34;没有TypeTag可用于a.T&#34;

您可以将类A视为某个容器(例如Map),并将伴随对象中的apply方法视为创建实际实现(例如HashMap)。 B在这个比喻中就像MapEntry一样,我想构建把这个MapEntry放到另一个容器中,询问给定元素的TypeTag

我希望这个想法很清楚。有没有办法做到这一点?

我使用的是Scala 2.10.4。

1 个答案:

答案 0 :(得分:0)

当您明确定义A的子类时,您的示例实际上可行,如下所示:

object A {
  class Ab extends A {
    class B2 extends B
    type T = B2
    def newT = new B2
  }
  def apply() = new Ab
}

或者您可以使用WeakTypeTag,如下所示:

class E[T: WeakTypeTag](x: T)

有关详情,请参阅此issue