我经常使用UUID.randomUUID()
。 kotlin推断的类型是UUID!
。有没有办法告诉kotlin这个特定方法的返回类型是UUID
并且总是非空?或者我必须在任何地方UUID.randomUUID()!!
或实施我自己的方法吗?
答案 0 :(得分:3)
如果你明确声明了类型,它应该声明它们是非可空的而不是平台类型。
val id1 = UUID.randomUUID() // UUID!
val id2: UUID = UUID.randomUUID() // UUID
我这样做的功能是让事情变得更容易一些。通过声明返回类型,它具有相同的效果:
fun generateUUID(): UUID = UUID.randomUUID()
或作为扩展名:
fun UUID.next(): UUID = UUID.randomUUID()
答案 1 :(得分:1)
Kotlin不会强迫您在平台类型上使用!!
。如果Java函数的返回值没有可空性注释@NotNull
或@Nullable
,则可以将其视为可空或非空:
val uuid1: UUID = UUID.randomUUID()
val uuid2: UUID? = UUID.randomUUID()
如果将其视为非null类型但实际上为null,则抛出异常。
Kotlin's doc:
如果我们选择非null类型,编译器将在赋值时发出一个断言。这可以防止Kotlin的非null变量保留空值。当我们将平台值传递给期望非空值等的Kotlin函数时,也会发出断言。总的来说,编译器尽最大努力防止空值在程序中传播很远(尽管有时这是不可能完全消除的,因为泛型)。