Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Function.contains()未按预期方式在Groovy中工作_Java_Groovy_Contains - Fatal编程技术网

Java Function.contains()未按预期方式在Groovy中工作

Java Function.contains()未按预期方式在Groovy中工作,java,groovy,contains,Java,Groovy,Contains,我试图使用Groovy编程语言检查number是否是列表的成员 我有一段代码: List<Long> list = [1, 2, 3] Long number = 3 println(list.contains(number))​ List=[1,2,3] 长数=3 println(列表包含(编号))​ 预期的输出是true,但我得到的结果是false 有人对此有解释吗?您应该为long使用特殊的文字值:1L而不是1 List<Long> list = [1L, 2

我试图使用Groovy编程语言检查number是否是列表的成员

我有一段代码:

List<Long> list = [1, 2, 3]
Long number = 3

println(list.contains(number))​
List=[1,2,3]
长数=3
println(列表包含(编号))​
预期的输出是
true
,但我得到的结果是
false


有人对此有解释吗?

您应该为long使用特殊的文字值:1L而不是1

List<Long> list = [1L, 2L, 3L]
Long number = 3L
List List=[1L、2L、3L]
长数=3L

1是一个int。1L是一个long。

泛型类型参数在运行时不起作用。选中此项:

List<Long> list = [1, 2, 3]
list.each{println it.getClass()}
真正的混乱是由
.equals
=
实现之间奇怪的行为差异引起的:

Long.valueOf(3).equals(Integer.valueOf(3))
===> false
Long.valueOf(3) == Integer.valueOf(3)
===> true
List.contains
似乎在使用
.equals
,它检查参数的类,从而解释了为什么强制元素类型为
Long
可以解决问题

因此,在这种不确定性中,我认为唯一确定的是Groovy的
=
执行执行了最直观和最可预测的比较。所以我把支票改成:

boolean contains = list.grep{it == 3L} //sets value to true if matches at least 1
当您不必了解链接到文字的数据类型时,它会有所帮助:

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
任何人都希望这样:

true
true
true
true

你试过一个基本的long吗?我知道如何处理这个问题,但我更感兴趣的是为什么它不起作用。我明白了,但对我来说很奇怪,如果我声明long-s列表,只要我同意这是意外的(我也来自Java背景)。请注意,这会像你期望的那样起作用:
list.any(number)
这就是在JVM中实现泛型的方式。您可以使用GroovyConsole或调试器来检查实际列表。类型为
ArrayList
。元素类型的信息丢失。您甚至可以编写
List=[1L、2L、3L]
,这并不重要。
true
true
true
true