Jak*_*sić 6 java groovy contains
我正在尝试使用 Groovy 编程语言检查 number 是否是列表的成员。
我有这段代码:
List<Long> list = [1, 2, 3]
Long number = 3
println(list.contains(number))?
Run Code Online (Sandbox Code Playgroud)
预期的输出是true,但我得到的结果是false。
有人有解释吗?
泛型类型参数在运行时不可用。检查一下:
List<Long> list = [1, 2, 3]
list.each{println it.getClass()}
Run Code Online (Sandbox Code Playgroud)
哪个打印:
class java.lang.Integer
class java.lang.Integer
class java.lang.Integer
Run Code Online (Sandbox Code Playgroud)
.equals真正的混乱是由和实现之间奇怪的行为差异引起的==:
Long.valueOf(3).equals(Integer.valueOf(3))
===> false
Long.valueOf(3) == Integer.valueOf(3)
===> true
Run Code Online (Sandbox Code Playgroud)
List.contains似乎正在使用.equals,它检查参数的类,从而解释了为什么强制元素类型来Long解决问题。
所以,在这种不确定性之中,我认为唯一确定的是 Groovy 的==执行执行了最直观、最可预测的比较。所以我会将支票更改为:
boolean contains = list.grep{it == 3L} //sets value to true if matches at least 1
Run Code Online (Sandbox Code Playgroud)
当人们不必了解与文字相关的数据类型时,它会有所帮助:
def ints = [1, 2, 3]
def longs = [1L, 2L, 3L]
boolean found1 = ints.grep{it == 3L}
boolean found2 = ints.grep{it == 3}
boolean found3 = longs.grep{it == 3L}
boolean found4 = longs.grep{it == 3}
println found1
println found2
println found3
println found4
Run Code Online (Sandbox Code Playgroud)
这是任何人都想要的:
true
true
true
true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2365 次 |
| 最近记录: |