2017-07-19 125 views
2

我无法弄清楚下面这段代码有什么问题,看来我的getString必然!返回字符串其实,它的工作原理上面的线路,这是一个错误Kotlin在Android Studio中出现错误<< intent.putExtra(“string”,it.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 

Screenshot of error

+1

我填入关于Kotlin跟踪器的错误报告:https://youtrack.jetbrains.com/issue/KT-19139 –

回答

4

它认为从it.getString ("fragment")返回的值为空,空值与所有这些putExtra函数匹配。

e.g: resultIntent.putExtra("fragment", null)

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

all these parameters are objects and null can be set into all these parameters - "Overload resolution ambiguity. All these functions match"

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

我有以下科特林测试版本编译代码:

  • 1.1.3(于2017年6月23日发布):科特林建立自己的错误。
  • 1.1.2(2017年4月25日发布):kotlin构建错误。
  • 1.0.7(2017年3月15日发布):编译!没有错误!

然后,如果您使用版本1.0.7,它将工作! - 在Android工作室中设置此版本很难。 或者你也可以使用其他选项强制编译器避开/解决这个问题,例如:

  • '!!'it!!.getString("fragment")
  • 投给Stringit.getString("fragment") as String
  • ?: "":it.getString( “片段” )? “”
  • 等...
+0

谢谢,“它”为空使错误信息完美。但是我认为没有办法“它”可能是“空”。确实,请参阅下面我自己的答案:问题是Kotlin中没有“else if”,这很奇怪,但它就是这样,因此错误:一个模糊的语法错误。 –

+0

我错了,在Kotlin有一个“别的如果”。所以,我仍然不知道错误的原因。在我看来,就像一个编译器错误。 我不认为“it.getString(”string“)”可以为null。它可以?如果是这样,为什么在第一个“if块”中没有错误触发,但在“else if”块中触发? –

+0

感谢您使用不同的Kotlin版本进行测试,Victor。的确,它肯定是一个编译器错误。我会在填写Kotlin问题跟踪器的错误报告中报告您的发现。 https://youtrack.jetbrains.com/issue/KT-19139 直到它得到修复,我会明确(并且冗余)地说它是一个非空类型,使用'!!'按照您的建议操作。 –

0

愚蠢的错误:在Kotlin中没有if { } else if { }声明!只有if { } else { }

编辑:我错了,有一个

else if

在科特林

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

+0

嗯,绝对有[[else if]](https://kotlinlang.org/docs/reference/idioms.html #if-expression)语句在Kotlin中。不知道这是如何解决你的问题。 – Bryan

+0

嘿布莱恩,你是对的。还有一个如果构造。因此,在我看来,像编译器或IDE或其他东西的错误... –

0

你是把多个群众演员使用相同的密钥值。在这里,您使用的片段如下键值

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

,并再次在这里

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

这是打算。因为它是一个“if {else else if {}”,所以两行代码都不能在运行时运行 - 这是其中之一。 请参阅我自己的回答:问题是Kotlin中没有“else if”,这很奇怪,但它就是这样,因此错误:一个模糊的语法错误。 –

+0

编辑:我错了,在kotlin有一个“别的,如果”,所以我不知道是什么导致了错误。看起来像一个编译器bug ... –

1

这看起来像一个编译器错误。不过,我建议你重写它,只能从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) 
     } 
    } 
} 
相关问题