#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]