Kotlin 中的 Dagger 2 模块和通用参数

Dagger 2 Modules and generic parameters in Kotlin

问题是 Dager 2 是否支持适当的通用参数。我有以下测试 class:

@Module
class Test {

    @Provides
    fun t(
        l: List<String>,
        l1: List<Number> /* Error points to this dependency */
    ): String {

        return "String" + l + l1
    }

    @Provides
    fun list1(): List<Number>{
        throw Error()
    }

    @Provides
    fun list() : List<String> {
        throw Error()
    }
}

我在 AppComponent 中有用法

@Component(modules = [Test::class])
interface AppComponent {

    fun str(): String
}

当我尝试编译时出现以下错误:

/AppComponent.java:8: error: [Dagger/MissingBinding] java.util.List<? extends java.lang.Number> cannot be provided without an @Provides-annotated method. public abstract interface AppComponent { ^ java.util.List<? extends java.lang.Number> is injected at com.example.android.dagger.di.Test.t(…, l1) java.lang.String is requested at com.example.android.dagger.di.AppComponent.str()

问题是 Dagger 是否支持在模块中使用泛型参数类型

更新 根据@Jeff_Bowman 的回答,删除通配符的便捷方法是在 Kotlin typealias 上使用,如下所示:

typealias NumericList = List<@JvmSupressWildcards Number>

@Module
class Test {

    @Provides
    fun t(
        l: List<String>,
        l1: NumericList 
    ): String {

        return "String" + l + l1
    }

    @Provides
    fun list1(): NumericList{
        throw Error()
    }

    ........

}

java.util.List<? extends java.lang.Number> cannot be provided without an @Provides-annotated method

注意通配符:Kotlin defaults to using wildcards in a way that Java does not. You can adjust those types using the @JvmWildcard and @JvmSuppressWildcards 以确保 Dagger 看到匹配的声明。

您可以选择参数是否抑制了通配符,或者您的 @Provides return 值是否添加了通配符。答案可能取决于您是否希望您的大多数呼叫站点 Java 与 Kotlin。

@Provides
fun t(
    l: List<String>,
    l1: List<@JvmSuppressWildcards Number>  // Note wildcard suppression
): String {
    return "String" + l + l1
}

另请参阅: