Kotlin将字符串转换为String.Companion。

5
我刚开始学习 Kotlin,之前是 C# 出身。我在尝试使用类型和其他一些东西。我正在尝试创建一个名为“WalMartGreeters”的静态类,它可以将问候者添加到列表中,然后调用一个简单的静态函数来显示这些问候者。我的方法需要一个字符串参数/字符串列表来添加到可变字符串列表中,但是当我尝试向其中添加值时,我会得到一个预编译错误,提示“期望 String.Companion”,而实际上得到的是“String”。我试图将其更改为将 String 强制转换为 String.Companion,但是它会提示强制转换不合法。
我经常遇到的错误是:Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to 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");
            }
        }
    }
}

请将 prntList = mutableListOf(String) 替换为 prntList = mutableListOf<String>(),您使用了 MutableList<StringCompanionObject> 而不是 MutableList<String> 来初始化 prntList - holi-java
这样做可以解决问题,但为什么呢?我为什么能够将其初始化为mutableListOf(String)而没有语法错误?为什么默认情况下会将MutableList(String)强制转换为...String.Companion?这是因为它在Companion Object内部吗? - JoeyG2677
不,prntList.add(strNameToAdd) 报告了编译错误。你使用的是哪个编辑器? - holi-java
那是真的,但那是因为它无法将Java.String转换为Kotlin.String.Companion或其他什么的,为什么默认显示为String.Companion呢?我在Ubuntu上使用的是IntelliJ。另外,我可以输入更正,但宁愿把它交给你 <3 但我不能因为这是一条注释 :X - JoeyG2677
为什么 :: var prntList = mutableListOf(String) :: 不起作用?在 IntelliJ IDE 中,它会在伴随函数中报错,说给定了一个 String,但需要一个 String.Companion 项。为什么 mutableListOf<String>() 起作用,但 mutableListOf(String) 不起作用? - JoeyG2677
名称有多种含义。当在<>内或在:后使用String时,表示类型。当作为可调用函数时,String表示构造函数。当作为值时,String表示伴生对象,其中包含静态方法,例如String.format()mutableListOf(String)表示一个列表,其中只有一个元素,即(单例)String伴生对象,它实际上不是StringmutableListOf<String>()表示一个空的可变列表,其元素类型为String - ephemient
1个回答

7

首先,你提供的代码无法编译,因为prntListMutableList<String.Companion>而不是MutableList<String>。如果你想要prntList添加String,你需要将其类型更改为MutableList<String>,例如:

var prntList = mutableListOf<String>()

其次,在中的只是一个限定符,而不是一个类。这意味着将引用其范围内的特定引用。在您的情况下,限定符将引用其伴随对象

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

例如:
//                         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)之间的区别:
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接