如何用泛型方法查找数组中的整数?泛型比较报错疑问
泛型方法中无法使用
>比较的原因及解决办法 嘿,刚接触泛型踩这个坑太正常啦!我来给你拆解一下问题出在哪,以及怎么解决👇
为什么if(b[m] > key)会报错?
你定义的泛型参数<T>没有任何类型限定,编译器默认只知道它是Object的子类——而Object类(以及大部分自定义类)根本不支持>这种比较运算符!
这个运算符只能直接用于基本数据类型(比如int、long),但泛型只能接受引用类型(比如Integer、String),就算是包装类,编译器也没法确定你的T一定是支持比较的类型(比如你哪天把T换成自定义的User类,那>就完全没意义了),所以会直接报错。
解决办法:给泛型加上可比较的类型限定
如果你的需求是要对数组元素进行大小比较(比如有序查找、二分查找),必须让T实现Comparable<T>接口,这样就能用接口里的compareTo方法来替代直接的>比较了。
修改后的代码示例:
public class Question1 { /** * 此方法在有序可比较数组中查找指定元素 * @param b 待查找的数组 * @param key 要查找的元素 */ public static <T extends Comparable<T>> void search(T[] b, T key) { // 先做非空判断,避免空指针 if (b == null || key == null) { System.out.println("数组或查找元素不能为空哦"); return; } for (int m = 0; m < b.length; m++) { // 使用compareTo方法替代>、<、== int compareResult = b[m].compareTo(key); if (compareResult == 0) { System.out.println("找到啦!元素在索引" + m + "的位置"); return; } else if (compareResult > 0) { // 如果是升序数组,这里可以提前终止遍历,提高效率 System.out.println("索引" + m + "的元素比key大,后面不用找啦"); break; } } System.out.println("没找到指定元素哦"); } public static void main(String[] args) { // 注意:泛型数组不能用基本类型,要用包装类Integer Integer[] intArray = {1, 3, 5, 7, 9}; search(intArray, 5); // 会输出找到的位置 search(intArray, 4); // 会输出提前终止的提示 } }
额外小提醒
如果你的需求只是单纯判断元素是否存在,不需要比较大小,那其实可以直接用equals方法,但要注意空指针问题:
if (b[m] != null && b[m].equals(key)) { // 找到元素的逻辑 }
内容的提问来源于stack exchange,提问作者fishstick41
相关产品推荐
相关产品推荐

