kotlin - 平台类型/方法的非null标记

时间:2018-01-19 13:13:58

标签: java kotlin kotlin-interop

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

2 个答案:

答案 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函数时,也会发出断言。总的来说,编译器尽最大努力防止空值在程序中传播很远(尽管有时这是不可能完全消除的,因为泛型)。