为什么operator <Java泛型有编译器错误?

bja*_*fly 5 java generics

为什么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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jac*_*ack 20

Java中没有运算符重载.要获得类似的结果,您应该研究Comparable<T>哪些是为对象提供相同的功能.

所以在你的情况下它将是:

key.compareTo(x[mid]) < 0
Run Code Online (Sandbox Code Playgroud)

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

public class BinarySearch<T extends Comparable<T>>
Run Code Online (Sandbox Code Playgroud)

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

  • +1和`T扩展可比较<?超级T>`略微更灵活. (5认同)

Jas*_*n C 9

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

通常解决的方法是让您的密钥类实现Comparable<T>接口,并覆盖其compareTo()方法.

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

BinarySearch<T extends Comparable<T>>
Run Code Online (Sandbox Code Playgroud)

并使用compareTo()而不是<.