Ошибка сборки Kotlin в Android Studio по адресу << intent.putExtra («string», it.getString («string») >>

Я не могу понять, что случилось с следующим фрагментом кода. Кажется, что getString обязательно возвращает String. Фактически, он работает на линиях выше! Это ошибка?

fun loadExtraBundleIntoIntent(origIntent: Intent, resultIntent: Intent) { origIntent.extras?.let { if (it.getString("peerUid") != null) { resultIntent.putExtra("fragment", "ChatFragment") resultIntent.putExtra("peerUid", it.getString("peerUid")) } else if (it.getString("fragment") != null) { resultIntent.putExtra("fragment", it.getString("fragment")) } if (it.getString("action") != null) resultIntent.putExtra("action", it.getString("action")) } } 

Ошибка при

 resultIntent.putExtra("fragment", it.getString("fragment")) 

Сообщение об ошибке:

 Error:(80, 30) Overload resolution ambiguity: public open fun putExtra(p0: String!, p1: Bundle!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Parcelable!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Serializable!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Array<(out) Parcelable!>!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Array<(out) CharSequence!>!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Array<(out) String!>!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Boolean): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: BooleanArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Byte): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: ByteArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Char): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: CharArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: CharSequence!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Double): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: DoubleArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Float): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: FloatArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Int): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: IntArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Long): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: LongArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Short): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: ShortArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: String!): Intent! defined in android.content.Intent 

Скриншот ошибки

Он считает, что значение, возвращаемое из it.getString ("fragment") равно null, а нулевое значение соответствует всем этим функциям putExtra .

например: resultIntent.putExtra("fragment", null)

Bundle, Parcelable, Serializable, Parcelable, CharSequence, String, BooleanArray, ByteArray, CharArray, CharSequence, DoubleArray, FloatArray, IntArray, LongArray, ShortArray, String

все эти параметры являются объектами, а нуль может быть установлен во все эти параметры – «Неопределенность разрешения перегрузки». Все эти функции соответствуют "

Как-то компилятор считает, что значение «it» может быть null после 'else if' и это не должно произойти, потому что это тип Bundle! ненулевой. Я считаю, что это ошибка компилятора.

Я проверил со следующей версией kotlin, чтобы скомпилировать ваш код:

  • 1.1.3 (выпущен 23 июня 2017 г.): ошибка сборки котлина.
  • 1.1.2 (выпущен 25 апреля 2017 года): ошибка сборки kotlin.
  • 1.0.7 (выпущен 15 марта 2017 года): скомпилируйте! без ошибок!

Затем, если вы используете версию 1.0.7 , она будет работать! – Трудно настроить эту версию в студии Android. Или вы можете использовать другие параметры, чтобы заставить компилятор избежать / устранить эту проблему, например:

  • '!!' : it!!.getString("fragment")
  • cast to String : it.getString("fragment") as String
  • ?: "" : it.getString ("fragment")?: ""
  • и т.д…

Это похоже на ошибку компилятора. Тем не менее, я бы предложил вам переписать его так, чтобы вы только извлекали каждое значение один раз из Bundle, поэтому компилятор может сделать вывод, что второй аргумент putExtra () всегда не равен null:

 fun loadExtraBundleIntoIntent(origIntent: Intent, resultIntent: Intent) { origIntent.extras?.let { val peerUid = it.getString("peerUid") if (peerUid != null) { resultIntent.putExtra("fragment", "ChatFragment") resultIntent.putExtra("peerUid", peerUid) } else it.getString("fragment")?.let { resultIntent.putExtra("fragment", it) } it.getString("action")?.let { resultIntent.putExtra("action", it) } } } 

Вы добавляете несколько дополнительных функций с одинаковыми значениями ключа. Здесь вы используете фрагмент как ключевое значение здесь

  resultIntent.putExtra("fragment", "ChatFragment") 

и снова здесь

 resultIntent.putExtra("fragment", it.getString("fragment")) 

Глупая ошибка: нет, if { } else if { } заявление в Котлине! Существует только if { } else { } .

Редактировать: я ошибался, есть

иначе, если

в Котлине.

Я не знаю, почему он не компилируется.

Intereting Posts
Объединение нескольких тегов <script> в одно в Kotlin Ни один из следующих кандидатов не отвечает из-за несоответствия типа приемника Kotlin – Как добавить OnPageChangeListener в ViewPager Ошибка: выполнение выполнено для задачи ': app: kaptDebugKotlin' Использование Kotlin в сопутствующем объекте вызывает непредвиденную ошибку Ресивер RecyclerView вызывается самостоятельно Как разрушить конструктор в Котлине Как определить, является ли объект унаследованным от определенного класса в Котлине? В Kotlin, как я идиоматически обращаюсь к значениям вложенной карты с нулевым значением или возвращать значение по умолчанию? Как конвертировать список в карту в Котлин? Несоответствие типов. Обязательная карта <String, Any> Найдено карта <String, Any?> Как реализовать репозиторий интерфейса в другом модуле проекта в AndroidStudio с помощью Dagger2 и Kotlin Передача данных в BroadcastReceiver из PendingIntent (AlarmManager) Отсутствующие или конфликтующие зависимости для Anko floatingActionButton Возможно ли реализовать индивидуальное деструктурирование для не-класса данных в Котлин?