Lists.newArrayList的一個小坑
阿新 • • 發佈:2018-08-30
可變參 通過 class 兩個 用戶 轉型 找到 static 發現
把一個用戶ID轉換成List存儲,最開始我使用的方法是:
// 用戶ID Integer userId = 120; // id 轉 List List<integer> userIds = Lists.newArrayList(userId); // 通過userIds查詢用戶列表 List<User> userList = userService.findByIds(userIds);
發現查詢的結果一直為空, DEBUG發現userIds一直size = 0
原來是因為 Lists.newArrayList 存在兩個重載的方法:
publicstatic <K> List<K> newArrayList(K... c) { return new ArrayList(Arrays.asList(c)); } public static <K> List<K> newArrayList(int size) { return new ArrayList(size); }
我的調用走了下面的 newArrayList(int size) 方法,只是初始化了列表的長度而已!
按計劃應該是走第一個方法 newArrayList(K... c) 。。
於是把調用的代碼改成如下:
List<integer> userIds = Arrays.asList(userId);
再次測試, 成功返回了用戶數據!
分析原因為:
重載方法的調用優先級:
a.先匹配參數個數
b.參數類型的最佳匹配:直接所屬類 (newArrayList(int size) 這個就是直接所屬類)
c.如果沒有找到直接所屬類,會發生向上轉型,直至找父類參數,直觀上查找順序為:包裝類-》父類-》接口
d.如果向上轉型仍無法匹配,則查找可變參數列表 (newArrayList(K... c) 方法就是屬於可變參數列表)
Lists.newArrayList的一個小坑