5

为什么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;
        }
    }
4

4 回答 4

20

Java 中没有运算符重载。要获得类似的结果,您应该查看Comparable<T>哪个旨在为对象提供相同的功能。

因此,在您的情况下,它将是:

key.compareTo(x[mid]) < 0

但是要完成这项工作,您必须提供一个有界类型变量,T这还不够,因为编译器无法推断出用于代替T实现的类型,Comparable因此您应该使用:

public class BinarySearch<T extends Comparable<T>>

这是因为泛型不像在 C++ 中那样实现,在 C++ 中,模板是在编译阶段根据使用它们的类型构建的。您必须明确说明您T是什么,因为类型检查器需要这样做。

于 2013-08-08T03:45:13.537 回答
9

在 Java 中,您不能重载运算符。

通常解决这个问题的方法是让你的关键类实现Comparable<T>接口,并覆盖它的compareTo()方法。

然后,您会将类型参数限制T为仅实现 Comparable 的类型,例如:

BinarySearch<T extends Comparable<T>>

并使用compareTo()而不是<.

于 2013-08-08T03:45:53.463 回答
1

在 C++ 中,仅当类型 T 不支持 operator < 语义时,这将是一个编译时警告。

正确的。在 Java 中,没有可以支持运算符 <T的泛型声明中使用的类型。所以你得到一个编译错误。

于 2013-08-08T05:08:47.983 回答
0

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);
    }
}
于 2013-08-08T04:39:37.747 回答