2017-07-19 134 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) 
     } 
    } 
} 
相關問題