智慧型转换是不可能的,因为...是一个可变的属性,本来可能已经改变了

点心

我正在尝试获取一个类,该类结合了中的list,set和map Kotlin我希望编写isScalar函数,true如果对象仅包含一个元素并编写,它将返回

import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap
import it.unimi.dsi.fastutil.objects.ReferenceArrayList
import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet

class Args {

    var list : ReferenceArrayList<M>? = null

    var set : ReferenceOpenHashSet<M>? = null

    var map : Reference2ReferenceOpenHashMap<M, M>? = null

    fun isEmpty() : Boolean {
        return list === null && set === null && map === null
    }

    fun isScalar() : Boolean {
        if(list !== null && list.size == 1) {
            return true
        }
    }

}

不幸的是,相比之下,它给了我错误

list !== null && list.size == 1

Smart cast to 'ReferenceArrayList<M>' is impossible, because 'list' is a mutable property that could have been changed by this time

据我了解,这与多线程假设有关。在Java中,synchronized如果期望多用途,我将使函数生效。另外,如果我不写线程安全的话,我将完全可以忽略这一点。

我应该如何用Kotlin写作?

我看到了这个解决方案https://stackoverflow.com/a/44596284/258483,但是它期望MT,我不想这么做。如果无法做到,如何避免进行智能投射?

更新

问题是如何以相同的“过程”形式执行此操作。如何不使用智能铸造?

更新2

总结,据我所知,null在Kotlin中根本不可能将变量与进行显式比较因为一旦比较完之后,下一次您将不得不null再次使用类似的操作将其与之隐式比较,.?而您将无法避免这种情况。

托德

如果您利用null不能相等的事实1(或其他任何事实),则可以使此检查非常简洁:

fun isScalar() : Boolean =
    list?.size == 1

当对null的安全调用list.size返回null时,我们得到false因为1 != null否则,size将对返回的任何值进行比较,这将按您期望的那样工作。

通过使用null安全运算符(?.),您可以完全避免进行智能转换。Kotlin为我们提供了精巧的强制转换,以使代码更整洁,这是保护我们免受该功能滥用的一种方式Kotlin不会保护我们免受一切影响(例如,零除,例如您在评论中使用的示例)。您的代码正陷入智能浇铸可能出错的合法情况,因此Kotlin会提供帮助。

但是,如果您完全确定没有其他线程在工作,那么可以,此检查是“错误的”。在这种情况下,您将不需要警告。kotlinlang.org上该线程来看,您不是唯一的一个!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

聪明地投射到“位图!” 这是不可能的,因为'bitmap1'是一个可变的属性,这一次可能已经更改了

来自分类Dev

对 BootsrapButton 的智能转换是不可能的,因为 endtrip 是此时已更改的可变属性

来自分类Java

Java泛型不可能赋值?

来自分类Dev

无法将类型强制转换为“ ListViewModel”,因为“ binding.listViewModel”是一个可变的属性,此时可能已更改

来自分类Java

聪明地投射到“ ObserverT !!” 这是不可能的,因为“ item.get()”是一个复杂的表达式

来自分类Dev

智能投射到“位图!” 是不可能的,因为 'textBitmap' 是一个局部变量,由变化的闭包捕获

来自分类Dev

在C#泛型中这是不可能的吗?

来自分类Dev

了解“不可能”

来自分类Dev

不可能的NullPointerException

来自分类Dev

列出索引超出范围,但似乎不可能,因为它只在 3 个问题之后

来自分类Dev

将NSFont转换为CGFont-不可能吗?

来自分类Java

有可能是一个接口有一个已经实例化对象的属性?

来自分类Dev

不可能删除一个ppa

来自分类Dev

不可能有一个带有泛型的基于数组的Queue吗?

来自分类Dev

参数杂耍是不可能的,因为当传递 undefined 时,arguments.length 也会增加

来自分类Java

Smartcast是不可能的,因为酒店有开或自定义的getter

来自分类Dev

Redux-使不可能的状态变为不可能

来自分类Dev

逆矩阵不可能

来自分类Dev

消除不可能的选择

来自分类Dev

REST 用户不可能?

来自分类Mysql

MySQL ...不可能的查询?

来自分类Dev

不可能合并分支

来自分类Dev

BitVector操作不可能

来自分类Dev

不可能停止AVPlayer

来自分类Dev

不可能挂载/ mnt

来自分类Dev

不可能更新实体

来自分类Dev

CSS居中是不可能的

来自分类Dev

TDD,不可能的例外

来自分类Java

它是不可能有一个@RequestParam作为一个列表?

Related 相关文章

  1. 1

    聪明地投射到“位图!” 这是不可能的,因为'bitmap1'是一个可变的属性,这一次可能已经更改了

  2. 2

    对 BootsrapButton 的智能转换是不可能的,因为 endtrip 是此时已更改的可变属性

  3. 3

    Java泛型不可能赋值?

  4. 4

    无法将类型强制转换为“ ListViewModel”,因为“ binding.listViewModel”是一个可变的属性,此时可能已更改

  5. 5

    聪明地投射到“ ObserverT !!” 这是不可能的,因为“ item.get()”是一个复杂的表达式

  6. 6

    智能投射到“位图!” 是不可能的,因为 'textBitmap' 是一个局部变量,由变化的闭包捕获

  7. 7

    在C#泛型中这是不可能的吗?

  8. 8

    了解“不可能”

  9. 9

    不可能的NullPointerException

  10. 10

    列出索引超出范围,但似乎不可能,因为它只在 3 个问题之后

  11. 11

    将NSFont转换为CGFont-不可能吗?

  12. 12

    有可能是一个接口有一个已经实例化对象的属性?

  13. 13

    不可能删除一个ppa

  14. 14

    不可能有一个带有泛型的基于数组的Queue吗?

  15. 15

    参数杂耍是不可能的,因为当传递 undefined 时,arguments.length 也会增加

  16. 16

    Smartcast是不可能的,因为酒店有开或自定义的getter

  17. 17

    Redux-使不可能的状态变为不可能

  18. 18

    逆矩阵不可能

  19. 19

    消除不可能的选择

  20. 20

    REST 用户不可能?

  21. 21

    MySQL ...不可能的查询?

  22. 22

    不可能合并分支

  23. 23

    BitVector操作不可能

  24. 24

    不可能停止AVPlayer

  25. 25

    不可能挂载/ mnt

  26. 26

    不可能更新实体

  27. 27

    CSS居中是不可能的

  28. 28

    TDD,不可能的例外

  29. 29

    它是不可能有一个@RequestParam作为一个列表?

热门标签

归档