2017-08-06 65 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)