1 回答
TA贡献1854条经验 获得超8个赞
可空类型本身不是类,因此它们没有类对象。这就是KClass's 类型参数有Any上限的原因。
您可以调用可::class.java为 null 的具体化类型,但它将被评估为与相应非 null 类型上的相同调用相同的类对象。因此,如果替换E::class.javaObjectType为E::class.java,将在运行时检查元素的类型,但不会进行 null 检查。
如果需要空检查,可以自己添加。我还建议将数组创建移至工厂方法。您可以这样做:
class CheckedStack<E>(private val array: Array<E?>, private val isNullable: Boolean) : Stack<E> {
companion object {
// This method invocation looks like constructor invocation
inline operator fun <reified E> invoke(size: Int): CheckedStack<E> {
return CheckedStack(arrayOfNulls(size), null is E)
}
}
private var index: Int = -1
override fun push(elem: E) {
if (!isNullable) elem!!
check(index < array.size - 1)
array[++index] = elem
}
override fun pop(): E {
check(index >= 0)
@Suppress("UNCHECKED_CAST")
return array[index--] as E
}
}
添加回答
举报