2016-09-06 7 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のに仕事ができるジェネリッククラスの名前を知っていますか?または
  • GuiceとClassTag[T]を結びつける方法はありますか?

全コード:@ tavian-バーンズヘルプに

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/フォーラム/#!topic/google-guice/1jbWcdeCF6U。私はGuiceとScalaでそれを実装しようとしましたが、私は成功しませんでした。例: '@Provides def provideTest [T:ClassTag]():TypeLiteral [ClassTag [T]] = { TypeLiteral.get(Types.newParameterizedType(ClassTag.getClass、classTag [T] .getClass)) }'(コンパイルされません)。何か案が ? – Dnomyar

+0

ここで何をやっているのか分かりませんが、「ClassTag」ではなく、実際には*を意味していました。 –

答えて

0

おかげで、私はこの問題を解決する方法を発見しました。 解決策は、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` 

} 
関連する問題