2016-09-06 11 views
0

Я хотел бы знать имя универсального класса.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]) { 

} 
+0

Может быть, вы можете использовать Guice в 'TypeLiteral' вместо' ClassTag'? –

+0

Я нашел несколько тем для использования 'TypeLiteral' http://stackoverflow.com/questions/8772555/generics-hell-can-i-construct-a-typeliteralsett-using-generics https://groups.google.com/ forum/#! topic/google-guice/1jbWcdeCF6U. Я пытался реализовать это в Scala с Guice, но я не добился успеха. Пример: '@Provides def обеспечитьTest [T: ClassTag](): TypeLiteral [ClassTag [T]] = { ТипLiteral.get (Types.newParameterizedType (ClassTag.getClass, classTag [T] .getClass)) }' (не компилируется). Есть идеи ? – Dnomyar

+0

Не уверен, что вы там делаете, но я действительно имел в виду * вместо * 'ClassTag'. –

ответ

0

Благодаря @ Tavian-Барнса помощь, я нашел способ решить эту проблему. Решение состоит в том, чтобы добавить к A неявное значение TypeLiteral[T]. Затем вам нужно позвонить typeLiteral.getType.getTypeName, чтобы получить полное имя geneirc class 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` 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^