Kotlin 中的 Guice TypeLiterals

eva*_*ad3 7 generics dependency-injection guice kotlin

我有一个场景,我有一个通用接口,并希望在 Guice 中绑定该接口的多个实现。通常在 Java 中这意味着 TypeLiterals,在 Kotlin 中这将如何完成?

bind(TypeLiteral<Resolver<RealObject>>(){}).to(RealResolver::class.java)
Run Code Online (Sandbox Code Playgroud)

这给出了以下编译器错误: cannot access <init>: it is public/*package*/ in 'TypeLiteral'

有一个 TypeLiteral.get() 方法,但我似乎也无法让它工作

hot*_*key 9

new TypeLiteral<Resolver<RealObject>>(){}您应该使用 Kotlin对象表达式而不是 Java 匿名类语法 ( ) :

bind(object : TypeLiteral<Resolver<RealObject>>() { }).to(RealResolver::class.java)
Run Code Online (Sandbox Code Playgroud)

您可以将其包装到带有具体化类型参数的内联函数中:

inline fun <reified T> typeLiteral() = object : TypeLiteral<T>() { }
Run Code Online (Sandbox Code Playgroud)

然后将其用作:

bind(typeLiteral<Resolver<RealObject>>()).to(RealResolver::class.java)
Run Code Online (Sandbox Code Playgroud)

  • 我只想添加它,它按上述方式编译 - 但是请记住在注入点和声明上添加 @JvmSuppressWildcards 例如`bind(object : TypeLiteral&lt;Resolver&lt;@JvmSuppressWildcards RealObject&gt;&gt;() { }).to。 ....` 然后实现`class InjectionTest @Inject constructor(resolver: Resolver&lt;@JvmSuppressWildcards RealObject&gt;` (2认同)