我正在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
在通用案例中的工作?
答案 0 :(得分:1)
不确定这是最好的方法,但这似乎有效:
fun splitCSV(s : String) : Array<String> {
return ( s.split(",") as? Array<String>? ).sure() ;
}
尽管IntelliJ使用突出显示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!! }
}
但这不是问题; - )