2014-12-21 2 views
3

Я пытаюсь получить TypeTag или ClassTag для внутреннего типа, чтобы предоставить метод ClassTag методу с параметрами типа. Specicfically, у меня естьScala: Получение типаTag для внутреннего типа

trait Baz 
trait Foo { type Bar <: Baz } 

, и я хотел бы сделать что-то вроде

import scala.reflect.runtime.universe._ 
import scala.reflect._ 
typeTag[Foo#Bar] // or maybe 
classTag[Foo#Bar] 

, но я не получаю 'нет доступных typetag' ошибка. Моя конечная цель состоит в том, чтобы обеспечить ClassTag с, чтобы что-то вроде этого

import scala.reflect.ClassTag 
class Doer[A,B]()(implicit ctA:ClassTag[A], ctB:ClassTag[B]) 
object Fooer extends Doer[Foo, Foo#Bar]()(classTag[Foo], classTag[Foo#Bar]) 

ответ

5

Обычно вы можете получить теги типа и теги класса внутренних типов просто отлично. Однако Foo#Bar является абстрактным типом. Теги тегов и теги классов не могут быть получены из абстрактных типов. Вместо этого вы можете получить табличку с низким типом:

scala> weakTypeTag[Foo#Bar] 
res1: reflect.runtime.universe.WeakTypeTag[Foo#Bar] = WeakTypeTag[Foo#Bar] 

scala> class Doer[A, B]()(implicit wttA: WeakTypeTag[A], wttB: WeakTypeTag[B]) 
defined class Doer 

scala> new Doer[Foo, Foo#Bar]() 
res2: Doer[Foo,Foo#Bar] = [email protected] 
Смежные вопросы