我还是Generics的新手,我想知道为什么我不能做“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);
}
答案 0 :(得分:1)
在Java中,泛型不适用于基本类型(int,double等),但仅适用于Objects(Integer,Double等)。盒装数字(int - &gt; Integer)不能使用比较运算符(除了==但它的行为不是你想要的那种情况)。要解决您的问题,您有两种解决方案:
使您的T通用具有可比性(通过定义)。完成后,替换
b[m].equals(key)
与
key.compare(b[m]) < 0
请注意,由于数组中每个值的装箱,它没有得到很好的优化。这是Java的麻烦限制。目前,正在进行的尝试解决问题的工作,并允许泛型与原始值一起使用。它被称为the Valhalla project。
如果您想要优化解决方案,则必须采用与标准java.util.Arrays类相同的策略:复制每种基本类型的etod,而不使用泛型。
希望它有所帮助!
答案 1 :(得分:0)
发生错误是因为pushd C:
cd\
for /F "delims=" %%a IN ('dir /b /a-d /s chrome.exe') do (
start "" "%%a" --kiosk --fullscreen --incognito "https://www.netflix.com/in/"
)
pause
确实可以任何引用类型。让我们说T
现在是T
或java.util.UUID
或java.util.Scanner
。 java.util.List
无法比较这些类型的对象。有些人甚至无法进行比较。
所以你需要做的是将通用参数>
约束到可以比较的类型:
T
现在,您可以在public static <T extends Comparable<T>> void search(T[] b,T key)
^^^^^^^^^^^^^^^^^^^^^
上致电compareTo
进行比较。如果b[m]
大于参数:
b[m]
或者,您可以添加一个新的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)
通用。除非您有一些未显示的代码正在使用它,否则这是不必要的。