我试图获取一个类型别名的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。
答案 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。