일부 2.9.2 코드에서 man.typeArguments
을 사용하고 있었으나 Manifest
은 더 이상 사용되지 않습니다. 나는 <:<
방법에 접근하기 위해 typeOf[T]
을 사용하는 방법을 찾았지만, 내 인생을 위해서 typeArguments
이 어디로 갔는지 알 수 없다.typeArguments는 어떻게 가져 옵니까?
문맥을 위해, 나는 createParser[T: TypeTag]
방법을 쓰고있다. T
이 List[X]
인 경우 createParser[X]
의 목록을 연결하여 파서를 만듭니다. 또는 그게 어쨌든 내가하고 싶은 것입니다.
누구 내가 T
(또는 typeOf[T]
또는 typeTag[T]
또는 다른 생각할 수 T
-adjacent 개념에서 X
을 얻는 방법을 알고 여기에
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)
}
문제는 t는 itemType
입니다. 반사 API의 Type
이지만, streamParser
으로 보내기에 적합한 TypeTag
으로 변환하는 방법을 알아낼 수 없습니다.
parsers
값이 실제로 Parser
s의 TypeTag
s의 맵이며, 아마 내가 분석 할 물건의 종류에 getParser
방법에 모든 것을 넣어 일치 청소기 것이지만, 그 패턴에서 내 시도 지금까지는 타입에 매치하지 않는 것 같았다.
나는 이것을 할 수있는 쉬운 방법이 있다고 확신한다. 나는 새로운 구현과 그것에 익숙하지 않은 문서 사이에 끼어 들었다고 생각한다. (보다 2.11과)
, 스칼라 때문에 반사는 아직 실험적입니다. – ghik
이것이 공식적으로 사실이지만, 그 사용으로 인해 컴파일러 경고가 표시됩니다. – TOB
실제로'deprecation 경고를 발생시키는 것은'<: <'메쏘드 일 뿐이므로,'TypeTag'이 필요한 것을 할 수있을 때까지 그것들을 고수 할 것입니다. – TOB