Разница между как? Тип и как Тип? - PullRequest
0 голосов
/ 16 января 2020

У меня проблемы с выяснением различий между этими двумя утверждениями.

Первый использует as? оператор для приведения класса аннотации generi c к XYZ

this::class.annotations.find { it is XYZ } as? XYZ ?: return

А второй использует as? оператор и нулевого маркера

this::class.annotations.find { it is XYZ } as XYZ? ?: return

Ответы [ 2 ]

2 голосов
/ 16 января 2020

В первом случае вы используете безопасное приведение (как?) К необнуляемому типу XYZ. Если it является экземпляром XYZ, то он просто приведёт it к XYZ. Если it не является экземпляром XYZ (или если it равно нулю), то он вернет значение NULL.

Во втором случае вы используете небезопасное приведение (as) к типу XYZ, допускающему значение NULL ?. Если it является экземпляром XYZ или it равно нулю, тогда он будет преобразовывать it в XYZ? (или вернуть ноль, если it ноль). Если it не является экземпляром XYZ, оно выдаст исключение.

0 голосов
/ 16 января 2020

Насколько мне известно

this::class.annotations.find { it is XYZ } as? XYZ

значение приведения XYZ не равно нулю, но значение проверено как ноль перед приведением

this::class.annotations.find { it is XYZ } as XYZ?

значение приведения XYZ обнуляется и проверяет ноль после приведения

...