如何转换Array <t?>?到Kotlin的<t> </t> </t>中

时间:2012-04-03 11:21:57

标签: generics kotlin

我正在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 个答案:

答案 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!! }
}

但这不是问题; - )