kotlin – 平台types/方法的非null标记

我经常使用UUID.randomUUID() 。 由kotlin推断的types是UUID! 。 有没有什么办法告诉kotlin这种特定方法的返回types是UUID ,并且始终为非null? 或者我必须做到处都UUID.randomUUID()!! 或者实施我自己的方法?

如果你显式声明了types,它应该声明它们是不可空的而不是平台types。

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

我用一个函数来做这件事情,使事情变得更容易。 通过声明返回types,它具有相同的效果:

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

或作为延伸:

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

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

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

如果您将它视为非nulltypes,但实际上为null,则将引发exception。

Kotlin的文档 :
如果我们选择一个非nulltypes,编译器将在赋值时发出一个断言。 这可以防止Kotlin的非nullvariables持有空值。 当我们将平台值传递给Kotlin函数,期望非空值等时,也会发出断言。总的来说,编译器会尽最大努力防止空值在程序中传播(尽管有时这是不可能完全消除的,因为generics)。