Чтение ClassType параметра типа в признаке - PullRequest
3 голосов
/ 24 апреля 2019

Допустим, у меня есть черта Foo с параметром типа T, и мне нужно использовать ClassTag 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 Ответ

5 голосов
/ 24 апреля 2019

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

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