使用Java在AS中进行开发时,下面的行显示警告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的用户友好功能,还是我错过了一些东西?
特定问题:除了忘记广播之外,还有什么可能的方法来解决这些问题? :)
答案 0 :(得分:2)
可悲的是,这种特定方法:
context.getSystemService(@NonNull String name)
是非常古老的API,这是它的缺陷之一-它返回未指定类型和可空性的Object
,因此只能执行不安全/安全的强制转换。
您有一些较新的替代方法,它们可以为您提供安全的可为空的Service类对象:
// 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>()