Guice, не удалось связать ClassTag[T] (чтобы узнать имя класса T)

Я хотел бы знать имя универсального класса.

Решение, которое я использую сейчас, заключается в следующем. Я определил класс class A[T: ClassTag] {...}, чтобы он мог выполнять classTag[T].toString.

Это компилируется, но есть проблема с Guice. Я получаю сообщение об ошибке No implementation for scala.reflect.ClassTag<com.test.Person> was bound.

Есть :

  • Другое решение узнать имя универсального класса, который может работать с Guice? или
  • Способ связать ClassTag[T] с Guice?

Полный код:

package com.test

case class Person(age: Int)

class A[T: ClassTag] {

  // I need to know the (full) name of type T (e.g. com.test.Person)
  val tClassName = classTag[T].toString

}

class B @Inject()(a: A[Person]) {

}

person Dnomyar    schedule 06.09.2016    source источник
comment
Возможно, вы можете использовать TypeLiteral Guice вместо ClassTag?   -  person Tavian Barnes    schedule 06.09.2016
comment
Я нашел несколько тем для использования TypeLiteral stackoverflow.com/questions/8772555/ groups.google.com/forum/#!topic/google-guice/1jbWcdeCF6U . Я пытался реализовать это в Scala с помощью Guice, но мне это не удалось. Пример: @Provides def provideTest[T: ClassTag](): TypeLiteral[ClassTag[T]] = { TypeLiteral.get(Types.newParameterizedType(ClassTag.getClass, classTag[T].getClass)) } (не компилируется). Любая идея ?   -  person Dnomyar    schedule 07.09.2016
comment
Не знаю, что вы там делаете, но я действительно имел в виду вместо ClassTag.   -  person Tavian Barnes    schedule 07.09.2016
comment
Я не понимаю, что вы имеете в виду. Не могли бы вы привести пример, пожалуйста.   -  person Dnomyar    schedule 08.09.2016
comment
Из TypeLiteral<Person> вы можете использовать typeLiteral.getType().getTypeName(), чтобы получить полное имя Person. Я не знаю Scala, поэтому не могу привести пример Scala. Но проблема в том, что ClassTag<T> нельзя вводить, а TypeLiteral<T> можно.   -  person Tavian Barnes    schedule 08.09.2016
comment
Большое спасибо, все работает!   -  person Dnomyar    schedule 09.09.2016


Ответы (1)


Благодаря помощи @tavian-barnes я нашел способ решить эту проблему. Решение состоит в том, чтобы добавить к A неявное значение TypeLiteral[T]. Затем вам просто нужно вызвать typeLiteral.getType.getTypeName, чтобы получить полное имя класса Geneirc T.

Полный код:

package com.test

case class Person(age: Int)

class A[T]()(implicit val typeLiteral: TypeLiteral[T]) {

  val tClassName = typeLiteral.getType.getTypeName

}

class B @Inject()(a: A[Person]) {

    println(a.tClassName) // prints `com.test.Person`

}
person Dnomyar    schedule 09.09.2016