開發者構建一個包含 `Integer`、`Double`、`Boolean`、`String` 的原始類型 `List` (無泛型或 `List
List list = new ArrayList(); // 原始類型
list.add("蔡");
list.add(1);
list.add(3.14);
list.add(true);
// 查找字符串 - 僥倖成功 (首元素匹配)
Collections.binarySearch(list, "蔡"); // 返回 0
// 查找整數 - 直接崩潰
Collections.binarySearch(list, 1);
// ClassCastException: java.lang.String cannot be cast to java.lang.Integer
// 方案 1: 僅存放同一類型 (推薦)
List strList = new ArrayList<>();
strList.add("蔡");
strList.add("張");
strList.add("李");
Collections.sort(strList); // 必須先排序
int idx = Collections.binarySearch(strList, "張"); // 正常返回 1
// 方案 2: 統一包裝為可比較的公共接口 (罕見)
interface MyComparable extends Comparable {}
// 實現類需處理跨類型比較邏輯,極不推薦,破壞類型安全
| 方法簽名 | 適用場景 | 比較器來源 |
|---|---|---|
binarySearch(List<? extends Comparable<? super T>>, T) |
列表元素實現 `Comparable` (自然順序) | 元素自身的 `compareTo` |
binarySearch(List<?>, T, Comparator<? super T>) |
元素未實現 `Comparable` 或需自定義順序 | 傳入的 `Comparator` 實例 |
關鍵點:無論哪個重載,**列表必須按相同比較器預先排序**,且查找鍵類型必須與列表元素類型兼容 (可通過 `Comparator` 處理)。