簡體   English   中英

為什么operator <Java泛型有編譯器錯誤?

[英]why does operator < have a compiler error for Java generics?

為什么下面的條件key < x[mid]會導致編譯器抱怨操作符未定義?

在C ++中,只有當類型T不支持operator <語義時,這才是編譯時警告。 你如何在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 ++中那樣實現,其中根據使用它們的類型在編譯階段構建模板。 您必須明確說明您的T是什么,因為類型檢查器需要這樣。

在Java中,您不能重載運算符。

通常解決的方法是讓您的密鑰類實現Comparable<T>接口,並覆蓋其compareTo()方法。

然后,您可以將類型參數T限制為僅實現Comparable的類型,例如:

BinarySearch<T extends Comparable<T>>

並使用compareTo()而不是<

在C ++中,只有當類型T不支持operator <語義時,這才是編譯時警告。

正確。 在Java中有沒有類型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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM