私はman.typeArguments
いくつかの 2.9.2 コードで使用していましたが、Manifest
s が非推奨であるというメッセージを受け取りました。typeOf[T]
メソッドにアクセスする方法はわかりました<:<
が、一生どこに行ったのかわかりませんtypeArguments
。
文脈のために、私はcreateParser[T: TypeTag]
メソッドを書いています。T
が の場合List[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)
}
問題は、 がリフレクション API からのものであると表示されていることですが、それを に送信するのに適した に変換する方法がわかりitemType
ません。Type
TypeTag
streamParser
そのparsers
値は実際には s からTypeTag
s へのマップであり、すべてをメソッドに入れ、解析したいものの型に一致させる方Parser
がおそらくきれいでしょうが、型のパターン マッチングの試みはうまくいかなかったようです。getParser
これまでの作業。
これを行う簡単な方法があると確信しています。私は、新しい実装とそれに追いついていないドキュメントの間で板挟みになっているだけだと思います。