【问题标题】:Kotlin null checks during nullable WeakHashMap iterationKotlin 在可为空的 WeakHashMap 迭代期间进行空检查
【发布时间】:2019-12-14 00:25:41
【问题描述】:
// I know activity is not ideal here due to lack of equality guaranty; please ignore this part
private val mActivities: WeakHashMap<Activity, Int> = WeakHashMap()
....
mActivities.put(null, null)
mActivities.filter { (backStackEntry: Activity?) ->
    // Issue: this does not show any errors but fails at runtime
    Logger.warn("$TAG - Activity ${backStackEntry.localClassName}")
    val entry: Activity? = backStackEntry
    // Works as expected: this does show the error as expected
    Logger.warn("$TAG - Activity ${entry.localClassName}")
}

当我尝试遍历可能包含空值的 WeakHashMap 时,Kotlin 空安全检查不起作用。上面列举的例子。任何关于为什么会发生这种情况的想法都将不胜感激。谢谢!

澄清 ${backStackEntry?.localClassName} 有效,但我担心的是为什么 Android Studio 或构建逻辑没有显示 ${backStackEntry.localClassName} 的静态检查错误或编译错误。但是使用${entry.localClassName},Android Studio 会将此标记为错误。

【问题讨论】:

  • 试试这个:${backStackEntry?.localClassName}
  • 感谢您抽出宝贵时间 - ${backStackEntry?.localClassName} 有效,但我担心的是为什么 Android Studio 或构建逻辑没有显示 ${backStackEntry.localClassName} 的静态检查错误或编译错误。但是使用${entry.localClassName},Android Studio 会将此标记为错误。

标签: kotlin


【解决方案1】:

WeakHashMap&lt;Activity, Int&gt; 类型不提供有关其内容可空性的信息。

考虑将private val mActivities: WeakHashMap&lt;Activity, Int&gt; = WeakHashMap() 替换为private val mActivities: MutableMap&lt;Activity?, Int?&gt; = WeakHashMap()

由于您明确指定了backStackEntry 可空性并且编译器仍然没有将backStackEntry 取消引用标记为错误,这一定是一个错误,您应该在youtrack.jetbrains.com/issues/KT 上报告它。

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 2020-08-09
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多