【问题标题】:Kotlin Cast String as String.CompanionKotlin 将字符串转换为 String.Companion
【发布时间】:2017-08-06 01:33:32
【问题描述】:

所以我是学习 Kotlin 的新手,来自 C# 背景。我一直在搞乱类型和其他一些事情。我正在尝试创建一个静态类“WalMartGreeters”,它可以将欢迎者添加到列表中,然后调用一个简单的静态函数来显示它们。我的方法需要一个字符串参数/字符串列表来添加到可变字符串列表中,但是当我尝试向它添加值时。我收到一个预编译错误,说“预期的 String.Companion”“得到了 String”我尝试将其更改为将 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");
            }
        }
    }
}

【问题讨论】:

  • :),将prntList = mutableListOf(String) 替换为prntList = mutableListOf&lt;String&gt;(),将prntList 初始化为MutableList&lt;StringCompanionObject&gt; 而不是MutableList&lt;String&gt;
  • 做到了,但为什么呢?为什么我能够将它初始化为 mutableListOf(String) 而没有语法错误?为什么默认情况下会将 MutableList(String) 转换为... String.Companion?那是因为它在一个伴随对象中吗?
  • 否,prntList.add(strNameToAdd) 报编译错误。你用的是什么编辑器?
  • 没错,但那是因为它无法将 Java.String 转换为 Kotlin.String.Companion 或 w/e,为什么它默认显示为 String.Companion?我在 Ubuntu 上使用 IntelliJ。另外,我可以输入更正,但宁愿把它给你
  • 就像,为什么 :: var prntList = mutableListOf(String) :: 不起作用。在 intelliJ IDE 中,它会在伴随函数中给出错误,指出给出了 String 但需要 String.Companion 项。为什么 mutableListOf() 有效但 mutableListOf(String) 无效?

标签: string casting kotlin


【解决方案1】:

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

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&lt;String&gt;()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)

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 2019-11-19
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多