如何在Kotlin中将Array<T?>?转换为Array<T>

4

我正在学习 Kotlin,并尝试编写一个简单的字符串分割函数。我从以下代码开始:

fun splitCSV(s : String) : Array<String> {
    return s.split(",");
}

我猜这也可以写成这样:
fun splitCSV(s : String) : Array<String> = s.split(",");

但是我遇到了类型错误,因为s.split返回的是Array<String?>?而不是Array<String>。我找不到一种简单的方法进行转换,所以我编写了这个函数来完成转换:

fun forceNotNull<T>(a : Array<T?>?) : Array<T> {
    return Array<T>(a!!.size, { i -> a!![i]!! });
}

fun splitCSV(s : String) : Array<String> = forceNotNull(s.split(","));

然而,现在我出现了运行时错误:

ClassCastException:[Ljava.lang.Object;无法转换为[Ljava.lang.String

如果我将forceNotNull中的T更改为String,则可以正常工作,所以我想我离找到解决方案很近了。
这是正确的方法吗?如果是的话,如何修复forceNotNull以使其在通用情况下起作用?

1
函数 sureItemsNotNull 已经添加:http://youtrack.jetbrains.com/issue/KT-1391 - Stan Kurilin
@StasKurilin,你能举个例子说明如何使用上述函数定义吗? - tim_yates
2
你所遇到的异常显然是一个错误。在这种情况下,最简单的解决方案就是进行强制类型转换:s.split(",") as Array<String> - Andrey Breslav
@Andery 我猜测警告“此转换永远不会成功”也是一个错误。很高兴听到权威的回复,谢谢! - itsadok
这应该被关闭为33583235的重复问题。另一个问题更新,更直接,答案适用于当前的Kotlin 1.0 beta及以上版本。 - Jayson Minard
3个回答

1

不确定这是最好的方法,但这似乎可行:

fun splitCSV(s : String) : Array<String> {
  return ( s.split(",") as? Array<String>? ).sure() ;
}

尽管IntelliJ用"This cast can never succeed"突出显示as?... 所以我的最初乐观情绪正在消退

但奇怪的是,它似乎起作用了...

就像这样:

fun splitCSV(s : String) : Array<String> {
  return s.split(",").sure() as Array<String> ;
}

但是有同样的警告...我开始感到困惑了,所以我现在会停止 :-/

编辑

当然,您可以使用List<String>使其正常工作:

import java.util.List

fun splitCSV(s : String) : List<String> {
  return s.split(",")!!.map<String?,String> { it!! }
}

但那不是问题的重点 ;-)


就像Andrey所说,转换是正确的方法,因此你非常接近了...接受这个建议。 - itsadok
你能否在这里更新代码,将.sure()更改为!!,因为那是过时的代码。 - Jayson Minard

1

自此文章发布以来,Kotlin 已经发生了很多变化,现在有更简单和更好的(应避免显式转换)方法将 Array<T?>? 转换为 Array<T>,其中一种方法是执行以下操作:

val data: Array<String?>? = getData()
val notNullArray: Array<String> = data?.filterNotNull()?.toTypedArray() ?: arrayOf()

在这里,我们使用filterNotNull来获取一个List<String>,然后将该列表转换为一个Array<String>,但是如果原始数组是null,那么我们只需使用arrayOf(),它会给出一个空的Array<T>?:elvis运算符,如果其左侧表达式不为null,则返回其左侧表达式的值,否则返回其右侧表达式的值。

0

在 Kotlin 中,您可以简单地将字符串转换为数组:


fun splitCSV(s: String) = s.split(",").toTypedArray()

通过调用此函数

val array: Array<String> = splitCSV("ABC,XYZ,test,rupesh")

在 Kotlin 中,CharSequence.split(regex) 返回 List,如果你想要将其转换为 Array 类型,可以使用 .toTypedArray() 方法。

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