Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 注入由抽象类型参数化的typeliased类_Generics_Kotlin_Dagger 2 - Fatal编程技术网

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 )