为什么运算符 < Java 泛型会出现编译器错误?



为什么下面的条件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);
    }
}

相关内容

最新更新