Безопасное приведение Kotlin (или в этом контексте "небезопасный" -cast) скрывает возможное предупреждение NullPointerException от Android Studio - PullRequest
1 голос
/ 22 сентября 2019

При разработке в AS с Java ниже строка показывает предупреждение, что toggleSoftInput может производить NPE.Что весьма полезно, если вы забыли проверку NPE.

InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(....);

Но в случае с Kotlin это становится проблемой.Приведение с as означает, что IDE не потрудится проверить, может ли toggleSoftInput() производить NPE или нет, потому что as неявно подразумевает это.

val imm = mContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.toggleSoftInput()

Как только я использую безопасное приведение as?, IDEпредупреждает меня сделать безопасный вызов на imm, как это может быть null.

Общий вопрос: Что, если разработчик забудет выполнить безопасное приведение, не является ли это безопасным приведением Kotlinнеявно убивает дружественные пользователю возможности IDE, или я что-то упускаю?

Конкретный вопрос: Есть ли какой-нибудь возможный способ решения этих проблем, кроме как не забывать безопасное приведение?:)

1 Ответ

2 голосов
/ 22 сентября 2019

К сожалению, этот конкретный метод:

context.getSystemService(@NonNull String name)

- очень старый API, и это один из его недостатков - он возвращает Object неопределенного типа и обнуляемости, так что нет другого способа, кроме выполнения небезопасного / безопасного приведения.

У вас есть несколько новых альтернатив, которые дадут вам безопасные обнуляемые объекты класса обслуживания:

// available since API 23:
val ims23 = context.getSystemService(InputMethodManager::class.java)

// available in androidx.core
val imsCompat = ContextCompat.getSystemService(context, InputMethodManager::class.java)

// available in androidx.core:core-ktx
val imsKtx = context.getSystemService<InputMethodManager>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...