Kotlin将String转换为String.Companion

Joe*_*677 3 string casting kotlin

因此,我是来自C#背景的学习Kotlin的新手。我一直在弄乱类型和其他一些东西。我正在尝试创建一个“ WalMartGreeters”的静态类,该类可以将欢迎词添加到列表中,然后调用一个简单的静态函数来显示它们。我的方法将一个字符串参数/字符串列表添加到可变字符串列表中,但是当我尝试向其添加值时。我收到一个预编译错误,提示“预期的String.Companion”和“获取字符串”,我尝试将其更改为将String转换为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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

hol*_*ava 6

首先,您问题中的上述代码无法编译,因为prntListMutableList<String.Companion>而不是MutableList<String>。如果要prntList添加String,则需要将其类型更改为MutableList<String>,例如:

var prntList = mutableListOf<String>()
Run Code Online (Sandbox Code Playgroud)

其次,Stringin mutableListOf(String)只是一个限定词而不是一个类。这意味着String将引用其范围内的特定参考。在您的情况下,限定符将引用其伴随对象

可以通过仅使用类名作为限定符来调用伴随对象的成员。

例如:

//                         v--- reference to its companion object
val it:String.Companion = String
Run Code Online (Sandbox Code Playgroud)

另一方面,您还可以将限定符引用到顶级变量,例如:

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

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)
Run Code Online (Sandbox Code Playgroud)