Чтение типа classstype параметра в чертеже

#scala #guice #classtag

#scala #интерфейс #classstag

Вопрос:

Допустим, у меня есть признак Foo с параметром типа T, и мне нужен CLASSSTAG из T, который будет использоваться в Foo:

 trait Foo[T] {
    implicit def ct: ClassTag[T]
}
  

Я хочу добиться этого без реализации ct в каждой реализации Foo. например, я хочу избежать необходимости делать это каждый раз:

 class Bar extends Foo[String] {
    implicit def ct: ClassTag[String] = implicitly[ClassTag[String]]
}
  

Кроме того, получение TypeTag, неявного в конструкторе реализаций, не является опцией, поскольку я использую Guice для внедрения зависимостей, и он не может обрабатывать параметр тега неявного типа в конструкторе. Так что что-то подобное не вариант:

 class Bar(implicit val ct: ClassTag[String]) extends Foo[String]
  

В идеале я хочу что-то вроде этого:

 object Main extends App {
  trait Foo[T] {
    implicit def ct: ClassTag[T] = implicitly[ClassTag[T]]
  }

  class Bar extends Foo[String] {
    println(ct)
  }

  new Bar
}
  

Но приведенный выше код попадает в StackOverflowError во время выполнения, поскольку он вызывает себя рекурсивно.

Комментарии:

1. Как насчет abstract class Foo[T] (implicitly ct: ClassTag[T]) { ... } ? В будущем, когда у trait могли бы быть параметры, мы могли бы забыть об абстрактных классах.

Ответ №1:

Можете ли вы использовать абстрактный класс вместо trait?

 abstract class Foo[T](implicit val ct: ClassTag[T]) {
}
  

Комментарии:

1. Черт возьми, 30 секунд медленно 🙂

2. Спасибо! В итоге я использую абстрактный класс с привязкой к контексту: абстрактный класс Foo[T: classstag]