我试图在Java中学习泛型,我会认为这种方法可以用于查找数组中的最大值:
public static <T> T largestInArray(T[] inputArray){
T largest = inputArray[0];
for (int i = 1; i < inputArray.length - 1; i++){
if (inputArray[i] > largest)
largest = inputArray[i];
}
return largest;
}
但我得到一个错误说:二进制运算符的错误操作数类型&#39;&gt;&#39;我该怎么做?
答案 0 :(得分:12)
您只能在数字类型上使用比较运算符。如果您想比较通用类型,则必须确保他们实施Comparable
,并致电Comparable.compare()
:
public static <T extends Comparable<? super T>> T largestInArray(T[] inputArray) {
//...
if (inputArray[i].compareTo(largest) > 0) {
//...
}
compareTo()
将返回0表示相等的值,&lt;如果目标对象具有优先权,则为0,并且>如果参数优先,则为0。
或者,您可以使用自定义Comparator
,而不是依赖于自然顺序:
public static <T> T largestInArray(T[] inputArray, Comparator<? super T> comparator) {
//...
if (comparator.compare(inputArray[i], largest) > 0) {
//...
}
compare()
与上面的compareTo()
类似。
请注意,这些都已经实现为Collections
帮助程序,您可以通过包装数组轻松调用它们:
Collections.max(Arrays.asList(inputArray)/*, comparator*/)
答案 1 :(得分:2)
由于Java仅为数字类型定义了比较运算符>
,<
,>=
和<=
,因此您无法将它们应用于对象,包括通用对象。
相反,您需要告诉编译器T
的对象将实现Comparable<T>
接口。您将无法使用>
,但您可以通过致电compareTo
来完成所需操作:
if (inputArray[i].compareTo(largest) > 0) // Replaces inputArray[i] > largest