1

我经常使用UUID.randomUUID(). kotlin 推断的类型是UUID!. 有没有办法告诉 kotlin 这个特定方法的返回类型是UUID并且总是非空的?还是我必须到处做UUID.randomUUID()!!或实施我自己的方法?

4

2 回答 2

3

如果显式声明类型,则应将它们声明为不可为空而不是平台类型。

val id1 = UUID.randomUUID() // UUID!
val id2: UUID = UUID.randomUUID()  // UUID

我这样做是为了让事情变得更容易一些。通过声明返回类型,它具有相同的效果:

fun generateUUID(): UUID = UUID.randomUUID()

或作为扩展:

fun UUID.next(): UUID = UUID.randomUUID()
于 2018-01-19T13:52:38.353 回答
2

Kotlin 不会强迫您!!在平台类型上使用。如果 Java 函数的返回值没有可空性注释@NotNull@Nullable,则可以将其视为可空或非空:

val uuid1: UUID = UUID.randomUUID()
val uuid2: UUID? = UUID.randomUUID()

如果将其视为非空类型但实际上为空,则会引发异常。

Kotlin 的文档
如果我们选择非空类型,编译器将在赋值时发出断言。这可以防止 Kotlin 的非空变量持有空值。当我们将平台值传递给期望非空值等的 Kotlin 函数时,也会发出断言。总体而言,编译器会尽力防止空值在程序中传播很远(尽管有时这不可能完全消除,因为泛型)。

于 2018-01-19T13:51:58.470 回答