Параметры общего типа не отображаются во время выполнения. Проверьте это:
List<Long> list = [1, 2, 3]
list.each{println it.getClass()}
Какие отпечатки:
class java.lang.Integer
class java.lang.Integer
class java.lang.Integer
Истинная путаница возникает из-за странного различия в поведении между реализациями .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