Intereting Posts
Используйте подпроекты Gradle с мультиплатформой Kotlin Нажатие текстового поля для изменения фрагмента Kotlin addTextChangeListener lambda? android.support.v4.app.FragmentManager не может быть предоставлен без @ Provides- или @ Produces-аннотированного метода Параметр принудительного типа должен быть инвариантным на сайте-участнике, когда он является ковариантным на сайте объявления Это применимо для написания драйвера JDBC в Котлине? Kotlin падает на Android, когда выбранный вид элемента равен нулю Swift – выход из внешней функции из закрытия Строитель типа Builder? Как перевести это в котлин? kotlin android – Пользовательский диалог с шаблоном Builder и Java 8 лямбда Единый восклицательный знак в Котлине Как собирать подписи от нескольких участников государства в потоке корды? Разница между MutableList и List в Котлине Пользовательский десериализатор для любого списка в Джексоне Получение экземпляра подкомпонента в действие

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 в некоторых условиях, вы можете сделать функцию-оболочку, которая делает это утверждение. Это возможно в сочетании с дополнительной логикой или отступлением, в противном случае это вряд ли будет более кратким, чем утверждение ( !! ) на сайте вызова.