Java 如何使用泛型方法在数组中查找整数

Java 如何使用泛型方法在数组中查找整数,java,generics,computer-science,Java,Generics,Computer Science,我对泛型还是个新手,我想知道为什么我不能做“if(b[m]>key)”这可能是一件非常简单的事情,我太累了以至于没有注意到。但正如你们所看到的,我试图在一个整数数组中找到一个特定的数字。我做错了什么?它必须是一种通用方法 public class Question1<T> { /** * This method searches through the array of integers to check if they match the key. * @param b

我对泛型还是个新手,我想知道为什么我不能做“if(b[m]>key)”这可能是一件非常简单的事情,我太累了以至于没有注意到。但正如你们所看到的,我试图在一个整数数组中找到一个特定的数字。我做错了什么?它必须是一种通用方法

public class Question1<T>
{    
/**
 * This method searches through the array of integers to check if they match the key.
 * @param b array
 * @param key certain number
 */
public static <T> void search(T[] b,T key)
{
   int l = 0; 
    int r = b.length - 1;
    while (l <= r)
    {
        int m = (l + (r-l)/2);
        if(b[m].equals(key))
            System.out.println("Key: " + key.toString()+ " is in Element: " + m);

        if (b[m] > key)
        {
            l = m + 1;
        }
        else
        {
            r = m - 1;
        }
    }
    System.out.println("Not in array.");        
}
public static void main(String[] args)
{

    Integer[] iray = {1,2,3,4,5};
    int key = 4;
    search(iray,key);
}
公开课问题1
{    
/**
*此方法搜索整数数组以检查它们是否与键匹配。
*@param b数组
*@param键特定数字
*/
公共静态无效搜索(T[]b,T键)
{
int l=0;
int r=b.长度-1;
while(l键)
{
l=m+1;
}
其他的
{
r=m-1;
}
}
System.out.println(“不在数组中”);
}
公共静态void main(字符串[]args)
{
整数[]iray={1,2,3,4,5};
int键=4;
搜索(iray,key);
}

发生错误是因为
T
可以是任何引用类型。假设
T
现在是
java.util.UUID
java.util.Scanner
java.util.List
无法比较这些类型的对象。有些甚至根本无法比较

因此,您需要做的是将泛型参数
T
约束为可以比较的类型:

public static <T extends Comparable<T>> void search(T[] b,T key)
                 ^^^^^^^^^^^^^^^^^^^^^
public static <T> void search(T[] b,T key, Comparator<? super T> comparator)
或者,您可以添加一个新的
Comparator
参数,让此方法的调用者指定如何比较对象:

public static <T extends Comparable<T>> void search(T[] b,T key)
                 ^^^^^^^^^^^^^^^^^^^^^
public static <T> void search(T[] b,T key, Comparator<? super T> comparator)

此外,您似乎(意外地)提出了
问题
一般性问题。这是不必要的,除非您有一些未显示的代码正在使用它。

在Java中,泛型不能用于基本类型(int、double等),而只能用于对象(Integer、double等)。已装箱的数字(int-->Integer)不能使用比较运算符(除了==之外,但在这种情况下它的行为不是您想要的)。要解决您的问题,您有两种解决方案:

使你的T泛型成为可比的(通过定义)。完成后,更换

b[m].equals(key)

key.compare(b[m])<0
请注意,由于数组中每个值的装箱,它不是非常优化。这是Java的一个麻烦的限制。目前,正在努力解决这个问题,并允许泛型与原语值一起使用。它叫

如果您想要优化的解决方案,您必须采用与标准java.util.Arrays类中相同的策略:为每个基元类型复制etod,而不使用泛型


希望有帮助

无法将对象与
进行比较。
key.compare(b[m]) < 0