Generics 注入由抽象类型参数化的typeliased类
我有一个简单的接口和类:Generics 注入由抽象类型参数化的typeliased类,generics,kotlin,dagger-2,Generics,Kotlin,Dagger 2,我有一个简单的接口和类: interface Foo { fun value(): Int } class FooImpl : Foo { override fun value() = 100 } 现在我想为Foo创建一个工厂,并能够注入它。我正在使用以下代码进行尝试: interface FooFactory : () -> Foo @Module class AppModule { // provides FooFactory @Provides
interface Foo {
fun value(): Int
}
class FooImpl : Foo {
override fun value() = 100
}
现在我想为Foo
创建一个工厂,并能够注入它。我正在使用以下代码进行尝试:
interface FooFactory : () -> Foo
@Module
class AppModule {
// provides FooFactory
@Provides
fun provideFooFactory() = object : FooFactory {
override fun invoke() = FooImpl()
}
// uses FooFactory
@Provides
fun provideFoo(factory: FooFactory) = factory()
}
@Component(modules = [AppModule::class])
interface AppComponent {
fun foo(): Foo
}
以及注入Foo
的位置:
@Test
fun test() {
val component = DaggerAppComponent.builder().build()
val foo = component.foo()
Assert.assertEquals(100, foo.value())
}
工作完美!然而,我认为,将foodfactory
定义为一个接口有点难看,因此我尝试替换:
interface FooFactory : () -> Foo
与:
现在我得到了编译时错误:
Error:Gradle:
kotlin.jvm.functions.Function0<? extends net.chmielowski.daggerkotlin.Foo>
cannot be provided without an @Provides-annotated method.
而不是:
@Provides
fun provideFooFactory() = object : FooFactory {
override fun invoke() = FooImpl()
}
实施
@Provides fun provideFooFactory() = { FooImpl() }
表示返回类型为
()->FooImpl
,这将转换为函数0我今天遇到了一个类似的问题,我使用kotlin lambda通过dagger返回值
DaggerModule.kt
@Provides
fun provideFoo() = {
foo.get()
}
BarClass.kt
BarClass( private val fooFunction: () -> Foo )
我得到的错误和你看到的一样,dagger找不到提供的方法
(同上)
不确定您想做什么,但如果您只想注入一个工厂的foo,您可能需要使用Provider
,其中Provider.get()
将创建新的foos.net解决方案。它在没有typealias但只有函数类型()->Foo
的情况下工作吗?Provider是dagger中的一个类,因此不会涉及函数类型。不是工厂类,而是一个负责提供Foo的模块。如果您需要返回一个不同的Foo实现,请关闭整个模块(使用具有不同模块的不同组件,该模块可以提供Foo)。这里有关于您的问题的任何更新吗?正如官方dagger问题中所建议的那样:@jvmsuppresswidcards
能够修复问题。但是在你的例子中,我想知道它是否有效,它是否还没有解决问题,我仍然得到:错误:Gradle:kotlin.jvm.functions.functions 0使用typealias FooFactory=()->@JvmSuppressWildcards Foo
来代替它怎么样?我仍然得到错误,它的内容是functions.Function0现在如果没有@Provides注释的方法就无法提供
@Provides fun provideFooFactory() = { FooImpl() as Foo }
@Provides fun provideFooFactory(): FooFactory = { FooImpl() }
@Provides
fun provideFoo() = {
foo.get()
}
BarClass( private val fooFunction: () -> Foo )
kotlin.jvm.functions.Function0<? extends net.chmielowski.daggerkotlin.Foo>
cannot be provided without an @Provides-annotated method.
BarClass( private val fooFunction: () -> @JvmSuppressWildcards Foo )