Kotlin – функции расширения и типы платформ?

Я хочу добавить две функции расширения в ResultSet которая получает значение как LocalDate .

 fun ResultSet.getLocalDate(colName: String) = getDate(colName)?.toLocalDate() fun ResultSet.getLocalDate(colIndex: Int) = getDate(colIndex)?.toLocalDate() 

Проблема заключается в том, что getDate() возвращает Date! , и, очевидно, я мог бы получить нулевую ошибку без ?. вызов до toLocalDate() . Но кто-нибудь, кто использует это расширение, должен использовать результат как LocalDate? а не LocalDate! ,

Есть ли способ поддерживать тип платформы для согласованности? И позвольте пользователю функции расширения решить, разрешено ли оно обнулять или нет? Или я рассматриваю это неправильно как неудобство, а не функцию?

Solutions Collecting From Web of "Kotlin – функции расширения и типы платформ?"

Посмотрите на это под другим углом: если вы можете заставить свои функции вернуть значение платформы типа LocalDate! , Явная небезопасность Java будет распространяться на функции, используемые в вашем коде Kotlin: они возвратят null в любое время, возможно, неожиданно для вызывающего, используя возвращаемое значение как ненулевое.

Котлин, в свою очередь, не имеет нулевого значения, и он не позволит пропустить null молчание где-нибудь там, где он вызовет NPE. Вместо этого каждое значение передается либо как обнуляемое, либо пропускает ненулевую проверку или утверждение.

Типы платформ не обозначаются на языке, это всего лишь способ борьбы с небезопасной явностью Java (просто обработка всех значений Java как обнуляемых не будет работать ). Они предоставляют вам способ заявить, что вы считаете, что этот вызов кода Java не возвращает null : когда вы обращаетесь с T! как T , для его проверки создается утверждение. В противном случае вы работаете с платформой типа T! как с нулевым T? ,

Нулевая безопасность является одним из ключевых моментов в дизайне языка Kotlin, и это заставляет вас решать, для каждого значения в вашем коде Kotlin, является ли оно нулевым или нет.

У вас есть два варианта дизайна API:

  • Возвращает ненулевое значение, проверяя нулевое значение внутри вашей функции
  • Возвращает значение nullable и, таким образом, предупреждает вызывающего о возможном null

Однако, если функция имеет семантику, позволяющую вызывающему предположить, что она не вернет значение null в некоторых условиях, вы можете сделать функцию-оболочку, которая делает это утверждение. Это возможно в сочетании с дополнительной логикой или отступлением, в противном случае это вряд ли будет более кратким, чем утверждение ( !! ) на сайте вызова.