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

How to find a integer in an array using a Generics Method

我还是泛型的新手,我想知道为什么我做不到 "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);
}

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

所以你需要做的是将泛型参数T约束为可以比较的类型:

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

现在,您可以在 b[m] 上调用 compareTo 来比较它们。如果 b[m] 大于参数:

,该方法将 return 为正结果
if (b[m].compareTo(key) > 0)

或者,您可以添加一个新的 Comparator 参数,让此方法的调用者指定他们希望如何比较对象:

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

那么比较线就会变成:

if (comparator.compare(b[m], key) > 0)

此外,您似乎(不小心?)使 Question 通用。这是不必要的,除非您有一些未显示的代码正在使用它。

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

使您的 T 泛型具有可比性(通过定义 )。完成后,替换

b[m].equals(key)

key.compare(b[m]) < 0

请注意,由于数组中每个值的装箱,它不是很优化。这是 Java 的一个麻烦的限制。目前,正在进行一项尝试解决该问题的工作,并允许泛型与原始值一起使用。它被称为the Valhalla project

如果你想要优化的解决方案,你不得不采用与标准相同的策略 java.util.Arrays class:为每个基本类型复制你的 etod,而不使用泛型。

希望对您有所帮助!