为什么下面的条件key < x[mid]
会导致编译器抱怨运算符未定义?
在C++中,只有当类型T不支持运算符<
语义时,这才是编译时警告。如何在Java中实现等效功能?
package search;
public class BinarySearch<T>
{
public boolean binary_search_iterative (T[] x, T key)
{
int size = x.length;
if ( size == 0 ) { return false; }
int end = size - 1;
int start = 0;
while ( start <= end)
{
int mid = (end + start)/2 ;
if (key < x[mid])
{
end = mid - 1;
}
else if ( key > key[mid])
{
start = mid + 1;
}
else
{
return true;
}
}
return false;
}
}
Java中没有运算符重载。要获得类似的结果,您应该研究Comparable<T>
,它旨在为对象提供相同的功能。
所以在你的情况下,它会是:
key.compareTo(x[mid]) < 0
但要实现这一点,您必须提供一个有界类型变量,T
是不够的,因为编译器无法推断出用以代替T
的类型实现Comparable
,所以您应该使用:
public class BinarySearch<T extends Comparable<T>>
这是因为泛型不像C++那样实现,在C++中,模板是根据使用它们的类型在编译阶段构建的。您必须明确说明T
是什么,因为类型检查器需要这样做。
在Java中,不能重载运算符。
通常解决此问题的方法是让键类实现Comparable<T>
接口,并覆盖其compareTo()
方法。
然后,您可以将类型参数T
限制为仅实现Comparable的类型,例如:
BinarySearch<T extends Comparable<T>>
并使用compareTo()
而不是<
。
在C++中,只有当类型T不支持运算符<语义。
正确。在Java中,有no类型T
可以在支持运算符<的泛型声明中使用;。所以你会得到一个编译错误。
T总是自动装箱到对象<
只允许用于java中的基元数
对于任何基元数或从Number扩展的类,请尝试此操作:
package search;
public strictfp class BinarySearch<T extends Number>
{
public boolean binary_search_iterative (T[] x, T key)
{
int size = x.length;
if ( size == 0 ) { return false; }
int end = size - 1;
int start = 0;
while ( start <= end)
{
int mid = (end + start)/2 ;
if (key.doubleValue() < x[mid].doubleValue())
{
end = mid - 1;
}
else if ( key.doubleValue() > x[mid].doubleValue())
{
start = mid + 1;
}
else
{
return true;
}
}
return false;
}
public static void main(String[] args) {
BinarySearch<Integer> bs = new BinarySearch<Integer>();
bs.binary_search_iterative(new Integer[]{1,2}, 2);
}
}