环境
java:1.7
mongodb:3.4
场景
昨晚因为retainAll()
方法被搞了很久,我知道是取交集。只是公司封装的jar
不提示,导致浪费了很多时间。
下面程序模拟这个过程:
//测试数据
Integer aa = 10;
Long cc = 10L;
//模拟公司jar包封装的过程
List<Integer> aList = new ArrayList<Integer>();
aList.add(aa);
List<Long> dbList = (List)aList;
//当我调用其方法后,会返回dbList给我
//下面模拟我的业务代码
Set<Long> s = new HashSet<Long>();
s.addAll(db);//10
Set<Long> sh = new HashSet<Long>();
sh.add(cc);//10
s.retainAll(sh);
System.out.println(s);
其结果是:
[]
正确应该是:
[10]
原因
原因其实很明了,关键的步骤在于:
List<Long> dbList = (List)aList;
原本aList
是Integer
类型,通过上面的代码,虽然表面上转成了List<Long>
其实还是Integer
。
既然是人为封装的,为什么不做下判断呢?太浪费我时间了,毕竟把Integer
转成Long类型,并不存在掉精度的问题。