[英]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.