1. 程式人生 > >Lists.newArrayList的一個小坑

Lists.newArrayList的一個小坑

可變參 通過 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 存在兩個重載的方法:

     public
static <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的一個小坑