2016-08-18 3 views
0

можно легко извлечь информацию от типа PartialFunction типа, проверяя его typeArgs элемента:Получить аргументы типа информации о наследственных признаках от типа

scala> typeOf[PartialFunction[String,Int]].typeArgs 
res168: List[reflect.runtime.universe.Type] = List(String, Int) 

Однако, если я совмещаю PartialFunction с другим признаком, кажется, у меня есть потеряли способность извлекать аргументы типа на PartialFunction признака:

scala> val t = typeOf[Iterable[Any] with PartialFunction[String,Int]] 
t: reflect.runtime.universe.Type = scala.Iterable[Any] with scala.PartialFunction[String,Int] 

scala> t.typeArgs 
res170: List[reflect.runtime.universe.Type] = List() 

оказывается, что t сохраняет что List(String, Int) информация, как и я t сохраняет информацию о том, что это with PartialFunction[String,Int], но я больше не вижу способа извлечь эту информацию о типе.

Как получить аргументы типа PartialFunction типа SomeTrait with PartialFunction[String,Int]?

ответ

2

Решение

t.baseType(typeOf[PartialFunction[_,_]].typeSymbol).typeArgs 

Объяснение

Вы можете проверить базовые классы в цепочке наследования через baseClasses члена:

scala> t.baseClasses 
res181: List[reflect.runtime.universe.Symbol] = 
    List(<refinement of scala.Iterable[Any] with String => Int>, 
    trait PartialFunction, 
    ...) 

Вы можете получить Symbol, представляющий PartialFunction оттуда, и используйте его для получения PartialFunction экземпляра t через baseType method.

scala> val pf = t.baseType(t.baseClasses(1)) 
pf: reflect.runtime.universe.Type = PartialFunction[String,Int] 

Теперь вы можете проверить аргументы типа этого PartialFunction согласно нормальным:

scala> pf.typeArgs 
res192: List[reflect.runtime.universe.Type] = List(String, Int) 

Если вы знаете тип признака, что вы хотите получить доступ, было бы безопаснее ссылаться на него конкретно, а не вытягивая его из набора базовых классов:

scala> t.baseType(typeOf[PartialFunction[_,_]].typeSymbol).typeArgs 
res202: List[reflect.runtime.universe.Type] = List(String, Int) 

 Смежные вопросы

  • Нет связанных вопросов^_^