我man.typeArguments
在一些 2.9.2 代码中使用,但收到一条Manifest
已弃用的消息。我想出了如何使用typeOf[T]
来访问该<:<
方法,但我一生都无法弄清楚去哪里typeArguments
了。
对于上下文,我正在编写一个createParser[T: TypeTag]
方法。If T
is aList[X]
那么我通过链接createParser[X]
. 或者这就是我想做的,无论如何。
任何人都知道我应该如何X
从T
(或typeOf[T]
或typeTag[T]
任何其他可想象的T
-相邻概念中得到?
这是 2.9.2 中的代码:
def getParser[T](implicit man: Manifest[T]): Parser[T] = {
if (man <:< manifest[Stream[_]]) {
val itemType = man.typeArguments(0)
streamParser(itemType).asInstanceOf[Parser[T]]
} else {
parsers(man)().asInstanceOf[Parser[T]]
}
}
def streamParser[T](implicit man: Manifest[T]): Parser[Stream[T]] = {
val itemParser = getParser(man)
(openParser("[") ~> repsep(itemParser, comma) <~ closeParser("]")) ^^ (_.toStream)
}
这是我在 2.10.1 中尝试的,但运气不佳:
def getParser[T](implicit tag: TypeTag[T]): Parser[T] = {
if (tag.tpe <:< typeOf[Stream[_]]) tag.tpe match {
case TypeRef(_, _, List(itemType)) => streamParser(itemType).asInstanceOf[Parser[T]]
} else {
parsers(tag)().asInstanceOf[Parser[T]]
}
}
def streamParser[T](implicit tag: TypeTag[T]): Parser[Stream[T]] = {
val itemParser = getParser(tag)
(openParser("[") ~> repsep(itemParser, comma) <~ closeParser("]")) ^^ (_.toStream)
}
问题是它说itemType
是Type
来自反射 API,但我不知道如何将它变成TypeTag
适合发送到streamParser
.
该parsers
值实际上是从TypeTag
s 到Parser
s 的映射,将所有内容放入getParser
方法中并匹配我要解析的事物的类型可能会更干净,但我对类型进行模式匹配的尝试似乎并没有工作至今。
我确信有一种简单的方法可以做到这一点——我想我只是陷入了一个新的实现和没有赶上它的文档之间。