我不断收到一条消息,告诉我类型为<
的运算符T,T
未定义。这种情况正在发生
if(index<lowest)
我如何修改程序以便使用通用方法获取数组列表的最小值和最大值?
package p07;
import java.util.ArrayList;
public class MyList<T extends Number> {
private ArrayList<T> l;
public MyList(ArrayList<T> l) {
this.l=l;
}
public void add(T x) {
l.add(x);
}
public static <T> void smallest(ArrayList<T> l) {
T lowest=l.get(0);
for(T index:l) {
if(index<lowest) {
}
}
}
}
答案 0 :(得分:-1)
编译器是正确的:运算符<
仅适用于原始数字类型。引用JLS的section 15.20.1:
数值比较运算符的每个操作数的类型必须是可转换(第5.1.8节)到基本数字类型的类型,否则会发生编译时错误。
因此,它没有为Objects定义,甚至没有为Numbers定义,因为它们不能拆箱到原始类型:JLS的section 5.1.8:
如果类型是数字类型(§4.2),则称该类型可转换为数字类型,或者它是可通过拆箱转换转换为数字类型的引用类型。
您需要的是使用Comparator
或制作对象Comparable
。 Comparator
负责比较两个相同类型的对象。由于此处的对象是Numbers,而且它们不是Comparable
,因此您需要使用自定义Comparator
,如下所示:
Comparator<Number> myComparator = new Comparator<Number>() {
@Override
public int compareTo(Number n1, Number n2) {
// implement logic here.
// Return -1 if n1 < n2, 0 if n1 = n2, 1 if n1 > n2
}
};
然后你可以像这样使用这个比较器:
public static <T extends Number> T smallest(List<T> l) {
T lowest = l.get(0);
for (T index : l) {
if (myComparator.compareTo(index, lowest) < 0) {
index = lowest;
}
}
return lowest;
}
(请注意,我将T extends Number
添加到方法的类型中 - 这是因为该方法是静态的,因此它实际上声明了另一个类T
,即该类的类型。)
答案 1 :(得分:-1)
这里有几件事情,但是让我们从低调的语法水果开始。
算术运算符仅适用于原始值,T
非常Object
,因此您无法在此处使用它们。< / p>
您的语法的另一个细微差别在于,您T
的静态函数 与T
不一样 是你的班级。
你可以通过自己添加绑定来解决这个问题......
public static <T extends Number> void smallest(ArrayList<T> l)
...但这引出了我的问题,为什么你想让这种方法保持静态呢?
您使用参数l
模糊了字段l
的名称,因此您可能会认为这对于提供的实例{{1因为方法本身被声明为l
,所以它不会被激活,如果它不是,那么你仍然会隐藏该字段的名称。
您应该从该方法中删除static
,并从该函数中删除该参数。
static
但是现在,您遇到了一个问题,即您实际上返回最小值是什么。你应该把它归还而不是什么:
public void smallest() {}
如果您能够排序,从阵列中获取最后一个值很简单。您只需要确保所有元素都是public T smallest() {}
,以便对它们进行排序,以及您最关心的值 - 例如Comparable
,Integer
,Double
,Float
- 是。
Long
如果你可以排序,那么最小的是直截了当:
public class MyList<T extends Number & Comparable<T>> {}
通过这种方法获得最高价值,我将此作为练习留给读者。