2017-08-06 64 views
2

所以我是新來的學習Kotlin,來自C#背景。我一直在搞類型和其他一些事情。我正在嘗試創建一個「WalMartGreeters」的靜態類,它可以將歡迎者添加到列表中,然後調用一個簡單的靜態函數來顯示它們。我的方法需要一個字符串參數/字符串列表添加到可變字符串列表,但是當我試圖給它添加值時。我得到一個預編譯錯誤,說「期望String.Companion」「得到了字符串」我試圖改變它將字符串轉換爲String.Companion,然後它說轉換是非法的。Kotlin Cast String as String.Companion

中主要的錯誤,我得到的是:異常在線程「主要」 java.lang.ClassCastException:java.lang.String中不能轉換到kotlin.jvm.internal.StringCompanionObject

fun main(args:Array<String>) { 
    walMartGreeter.addTo("Jean") 
    walMartGreeter.addTo("Dale") 
    walMartGreeter.addTo("Phil") 
    walMartGreeter.addTo("Chris") 
    walMartGreeter.listTheWholeFam() 
} 

class walMartGreeter(val strName:String) { 
    companion object classList { 
     var prntList = mutableListOf(String) 

     fun addTo(strNameToAdd:String) { 
      prntList.add(strNameToAdd) 
     } 

     fun addTo(listOfNames:List<String>) { 
      for (item in listOfNames) { 
       prntList.add(item) 
      } 
     } 

     fun listTheWholeFam() { 
      //println("All I do is $strName") 
      for(item in prntList) { 
       println("Hello, $item!") 
      } 
      //println("type of mutList: ${mutList.ToString()}") 
      if(prntList is MutableList) { 
       println("Yeah, it's a mutableList"); 
      } 
     } 
    } 
} 
+0

:),用'prntList = mutableListOf ()'替換'prntList = mutableListOf(String)',你用'MutableList '初始化'prntList',而不是'MutableList '。 –

+0

這樣做,但爲什麼?爲什麼我能夠將它初始化爲mutableListOf(String)而沒有語法錯誤?爲什麼默認情況下將MutableList(String)轉換爲... String.Companion?那是因爲它在一個伴侶對象中嗎? – JoeyG2677

+0

不,編譯錯誤報告爲'prntList.add(strNameToAdd)'。你正在使用什麼編輯器? –

回答

3

首先,代碼以上在你的問題不能被編譯,因爲prntListMutableList<String.Companion>而不是MutableList<String>。如果你想prntList,以增加String S,你需要將其類型更改爲MutableList<String>,例如:

var prntList = mutableListOf<String>() 

其次,在mutableListOf(String)String只是一個預選賽,而不是一類。這意味着String將在其範圍內引用特定參考。在你的情況下,限定符將參考其companion object

伴侶對象的成員可以簡單地使用類名作爲限定符來調用。

例如:

//       v--- reference to its companion object 
val it:String.Companion = String 

在另一方面,還可以使限定符參照頂級變量,例如:

val String = "" 
//       v--- reference to the top-level variable 
var prntList = mutableListOf(String) 
// ^---is a `MutableList<String>` rather than `MutableList<String.Companion>` now 

之間的不同mutableListOf<String>()mutableListOf(String)如下:

//    v--- it is a type argument of the `String` class 
mutableListOf<String>() 

//    v--- it is a qualifier that reference to `String.Companion` 
mutableListOf(String)