Kotlin:并行可空/空安全特性或接口的最佳实践?

Kotlin: best practice for parallel nullable / null safe trait or interface?

考虑以下简单特征:

trait HasAge {
    val dateOfBirth: LocalDate
    val age: Int
        get() = ...
}

现在假设我有这样一个人class:

class Person : HasAge {
    ...
    public override var dateOfBirth: LocalDate? = null
}

如果我构建一个库并且我想同时满足可为 null 和 null 安全的用户,我最终会得到像这样的重复项:

trait HasAge {
    val dateOfBirth: LocalDate
    val age: Int
        get() = ...
}

trait HasAgeN {
    val dateOfBirth: LocalDate?
    val age: Int?
        get() = ...
}

有没有更好的方法来实现这个?即可以处理这两种情况而无需复制所有内容的特征或库函数?

您可以用一个特性扩展另一个特性,覆盖类型:

trait HasAgeN {
  val date: LocalDate?
  val age: Int?
      get() = ...
}

trait HasAge : HasAgeN {
  override val date: LocalDate
  override val age: Int
      get() = ...
}

现在,接受 HasAgeN 的函数可以接受两个特征