在 scala 2.10 中获取 child 的通用类型
Get generic types of child in scala 2.10
class Parent[T: ClassTag] {
}
class Child[U: ClassTag, T: ClassTag] extends Parent[T] {
}
val o: Parent[_] = new Child[Int, String]
给定 o 是否有可能获得 T 和 U 的实际类型(注意它的类型 Parent[_]),假设你知道 o 的类型是 Child ?
我已经尝试了一些基于 Runtime resolution of type arguments using scala 2.10 reflection 的东西,但到目前为止没有运气。
如果稍微修改Parent
和Child
(注意: ClassTag
符号除了val
外基本相同,所以它没有给名字隐式参数或使其可从 class)
外部访问
class Parent[T](implicit val tTag: ClassTag[T]) {
}
class Child[U, T](implicit override val tTag: ClassTag[T], val uTag: ClassTag[U]) extends Parent[T] {
}
那你就可以了
val tTag = o.tTag // ClassTag[String]
当然,如果你需要 uTag
,你必须强制转换:o.asInstanceOf[Child[_, _]].uTag
,但它会起作用
assuming you know o is of type Child
class Parent[T: ClassTag] {
}
class Child[U: ClassTag, T: ClassTag] extends Parent[T] {
}
val o: Parent[_] = new Child[Int, String]
给定 o 是否有可能获得 T 和 U 的实际类型(注意它的类型 Parent[_]),假设你知道 o 的类型是 Child ?
我已经尝试了一些基于 Runtime resolution of type arguments using scala 2.10 reflection 的东西,但到目前为止没有运气。
如果稍微修改Parent
和Child
(注意: ClassTag
符号除了val
外基本相同,所以它没有给名字隐式参数或使其可从 class)
class Parent[T](implicit val tTag: ClassTag[T]) {
}
class Child[U, T](implicit override val tTag: ClassTag[T], val uTag: ClassTag[U]) extends Parent[T] {
}
那你就可以了
val tTag = o.tTag // ClassTag[String]
当然,如果你需要 uTag
,你必须强制转换:o.asInstanceOf[Child[_, _]].uTag
,但它会起作用
assuming you know o is of type Child