Kotlin在Android Studio上的错误<>

我无法弄清楚下面这段代码有什么问题。 似乎我getString必然返回一个字符串。 事实上,它在上面的线上工作! 这是一个错误?

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!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Array!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Array!): 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,并且null值与所有这些putExtra函数匹配。

例如: resultIntent.putExtra("fragment", null)

字符串,布尔数组,字节数组,字符数组,charArray,CharSequence,DoubleArray,FloatArray,IntArray,LongArray,ShortArray,String

所有这些参数都是对象,可以将所有这些参数设置为null – “过载分辨率模糊,所有这些函数匹配”

不知何故,编译器正在考虑'else if'后, “它”值可以为空,这不应该发生,因为它是一个types的Bundle! 非空。 我相信这是一个编译器错误。

我已经测试了以下kotlin版本来编译你的代码:

  • 1.1.3 (2017年6月23日发布):kotlin编译错误。
  • 1.1.2 (2017年4月25日发布):kotlin生成错误。
  • 1.0.7 (2017年3月15日发布):编译! 没有错误!

那么,如果你使用的版本是1.0.7 ,那么它将起作用! – 在Android工作室中设置这个版本很难。 或者您可以使用其他选项来强制编译器避免/解决此问题,例如:

  • '!!'it!!.getString("fragment")
  • it.getString("fragment") as StringStringit.getString("fragment") as String
  • ?: "" :it.getString(“fragment”)?:“”
  • 等等…

这看起来像一个编译器错误。 不过,我建议你重写它,只能从Bundle中检索一次值,所以编译器可以推断putExtra()的第二个参数总是非空的:

 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) } } } 

您正在使用相同的键值添加多个附加function。 这里你使用片段作为关键值

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

并再次在这里

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

愚蠢的错误: if { } else if { }在Kotlin中有if { } else if { }语句, if { } else if { }没有了! 只有if { } else { }

编辑:我错了,有一个

否则如果

在Kotlin。

我不知道为什么它不编译。