Dagger2 @Binds 方法的参数类型必须可分配给具有接口和实现的返回类型

HBG*_*HBG 3 android kotlin dagger-2

我有一个类实现了java.util.function.Function我想注入的接口,以便在另一个使用 Dagger2 的类中使用:

class MyUsefulClass @Inject constructor() : Function<List<String>, String> {

    override fun apply(lines: List<String>): String {
        // Do stuff 
        return ""
    }
}
Run Code Online (Sandbox Code Playgroud)

通常,我会@Binds在模块类中声明一个声明,如下所示:

@Module
interface MyModule {

    @Binds
    fun provideMyUsefulClass(concretion: MyUsefulClass): Function<List<String>, String>
}
Run Code Online (Sandbox Code Playgroud)

这种做法使我受益匪浅的所有其他类我已经在我的项目实现这个接口,但是在这一个实例中,我被错误消息映入眼帘:

@Binds methods' parameter type must be assignable to the return type…

有趣的是,将类的返回类型和@Binds声明更改为Function<MutableList<String>, String>fromFunction<List<String>, String>有效,一切都可以正常编译。

我在这里缺少什么?错误消息显然是不真实的。是否有一些我不知道的重大问题?

al3*_*l3c 5

我怀疑这可能是“缺少”@JvmSuppressWildcards 的情况,因此 kotlin? extends StringList类型中添加了一些,这使得 dagger 编译器失败(错误消息应该包含更多提示)。

我想您需要将函数类型更改为Function<List<@JvmSuppressWildcards String>, String>使用它的位置。

这是一个众所周知的烦恼,您可以在此处阅读更详细的内容:https : //medium.com/@naturalwarren/dagger-kotlin-3b03c8dd6e9b

我怀疑这MutableList没有那个问题,因为你可以用它“读”和“写”字符串。

  • 这确实非常烦人。我真的希望这里的错误消息更具描述性。谢谢您的回答。我在下面添加了一些参考资料,供以后遇到这个问题的任何人使用: - [Kotlin/ Dagger annoyances](https://adavis.info/2017/08/jvmsuppresswildcards-biggest-annoyance-kotlin.html) - [This来自 Google 开发关系的文章](https://medium.com/androiddevelopers/dagger-in-kotlin-gotchas-and-optimizations-7446d8dfd7dc) 声称 Dagger 2.25 版本修复了这个问题,但情况似乎并非如此,我刚刚使用“v2.26”复制了它 (3认同)