首页 文章

Kotlin Cast String as String.Companion

提问于
浏览
2

所以我是新来的学习Kotlin,来自C#背景 . 我一直在搞乱类型和其他一些东西 . 我正在尝试创建一个静态类“WalMartGreeters”,可以将列表添加到列表中,然后调用一个简单的静态函数来显示它们 . 我的方法采用字符串参数/字符串列表添加到可变字符串列表但是当我尝试向其添加值时 . 我得到一个预编译错误,说“期望String.Companion”“得到字符串”我试图改变它以将String转换为String.Companion,然后它说演员表是非法的 .

我得到的主要错误是:线程“main”中的异常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");
            }
        }
    }
}

1 回答

  • 3

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

    var prntList = mutableListOf<String>()
    

    其次, mutableListOf(String) 中的 String 只是一个 qualifier 而不是一个类 . 这意味着 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)
    

相关问题