Dagger 2 Set Multibinding не работает для SimpleEntry в Kotlin? - PullRequest
0 голосов
/ 25 октября 2019

Приведенное ниже мультисвязывание работает, когда вы предоставляете Pair как IntoSet

    @Provides
    @IntoSet
    fun entryOne(): Pair<String, String> {
        val key = randomStringGenerator()
        val value = "Random Value 1"
        return Pair(key, value)
    }

    @Provides
    @IntoSet
    fun entryTwo(): Pair<String, String> {
        val key = randomStringGenerator()
        val value = "Random Value 2"
        return Pair(key, value)
    }

    @Provides
    fun randomKeyValueMap(entries: Set<Pair<String, String>>): Map<String, String> {
        val randomKeyValueMap = LinkedHashMap<String, String>(entries.size)
        for (entry in entries) {
            randomKeyValueMap[entry.first] = entry.second
        }
        return randomKeyValueMap
    }

Однако, когда Pair превращается в SimpleEntry, оно больше не работает.

    @Provides
    @IntoSet
    fun entryOne(): AbstractMap.SimpleEntry<String, String> {
        val key = randomStringGenerator()
        val value = "Random Value 1"
        return AbstractMap.SimpleEntry(key, value)
    }

    @Provides
    @IntoSet
    fun entryTwo(): AbstractMap.SimpleEntry<String, String> {
        val key = randomStringGenerator()
        val value = "Random Value 2"
        return AbstractMap.SimpleEntry(key, value)
    }

    @Provides
    fun randomKeyValueMap(entries: Set<AbstractMap.SimpleEntry<String, String>>): Map<String, String> {
        val randomKeyValueMap = LinkedHashMap<String, String>(entries.size)
        for (entry in entries) {
            randomKeyValueMap[entry.key] = entry.value
        }
        return randomKeyValueMap
    }

Это жалобы

error: [Dagger/MissingBinding] java.util.Set<? extends java.util.AbstractMap.SimpleEntry<java.lang.String,java.lang.String>> cannot be provided without an @Provides-annotated method.
public abstract interface MyComponent {
                ^
      java.util.Set<? extends java.util.AbstractMap.SimpleEntry<java.lang.String,java.lang.String>> is injected at

Обратите внимание, если я использую Entry для Java, он работает нормально. Только не работает для Kotlin.

1 Ответ

0 голосов
/ 25 октября 2019

Похоже, мне нужны @ JvmSuppressWildcards

    @Provides
    @IntoSet
    fun entryOne(): Map.Entry<String, String> {
        val key = randomStringGenerator()
        val value = "Random Value 1"
        return AbstractMap.SimpleEntry(key, value)
    }

    @Provides
    @IntoSet
    fun entryTwo(): Map.Entry<String, String> {
        val key = randomStringGenerator()
        val value = "Random Value 2"
        return AbstractMap.SimpleEntry(key, value)
    }

    @Provides
    @JvmSuppressWildcards
    fun randomKeyValueMap(entries: Set<Map.Entry<String, String>>): Map<String, String> {
        val randomKeyValueMap = LinkedHashMap<String, String>(entries.size)
        for (entry in entries) {
            randomKeyValueMap[entry.key] = entry.value
        }
        return randomKeyValueMap
    }
...