Проблема с функцией перегрузки в kotlin - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь объявить два метода приостановки со списком String и PublishRequest Object в качестве параметра. Но IDE дает ошибку с этим. Ошибка либо сделать одну из функций внутренней или удалить приостановить. Но я хочу использовать сопрограммы внутри них.

    override suspend fun publish(publishRequests: List<PublishRequest>) {
       ///code

    }


    suspend fun publish(events: List<String>) {
     ///code

    }

Класс данных PublishRequest является внутренним. Проблемы появляются только тогда, когда мы добавляем метод publi sh (events: List) . Код работает нормально publi sh (publishRequests: List)

Можете ли вы объяснить, почему это происходит?

1 Ответ

3 голосов
/ 31 марта 2020

Проблема, с которой вы сталкиваетесь, связана с стиранием типа .

Типы List<PublishRequest> и List<String> стираются до List<*>, поэтому у вас будет JVM подпись cla sh.

Для решения вашей проблемы у вас есть два разных решения.

  1. Измените их имена и избегайте подписи cla sh:
    suspend fun publishRequests(publishRequests: List<PublishRequest>) {}
    suspend fun publishEvents(events: List<String>) {}
Используйте одну функцию с типом reified и обрабатывайте различные классы типов внутри этой функции:
suspend inline fun <reified T> publish(objects: List<T>) {
    when {
        PublishRequest::class.java.isAssignableFrom(T::class.java) -> // it's a list of PublishRequest
        T::class == String::class -> // it's a list of String
    }       
}
...