public Stats(T[] o) {
nums = o;
}
public double average() {
double sum = 0d;
for(int i = 0; i < nums.length; i++)
sum += nums.doubleValue(); //这里是错误的
return sum /nums.length;
}
}
在Stats类中,average()方法通过调用doubleValue(),试图获得nums数组中每个数字的double版本,因为所有数值类,比如Integer以及Double,都是Number的子类,而Number定义了doubleValue()方法,所以所有数值类型的封装器都可以使用该方法。问题是编译器不知道你正试图创建只使用数值类型的Stats对象。因此,当试图编译Stats时,会报错误,指出doubleValue()方法是未知的。为了解决这个问题,需要以某种方式告诉编译器,你打算只向T传递数值类型。此外,需要以某种方式确保实际上只传递了数值类型。
public Stats(T[] o) {
nums = o;
}
public double average() {
double sum = 0d;
for(int i = 0; i < nums.length; i++)
sum += nums.doubleValue();
return sum /nums.length;
}
}
package test;
public class BoundsDemo {
public static void main(String[] args) {
Integer inums[] = {1,2,3,4,5};
Stats<Integer> iob = new Stats<>(inums);
double v = iob.average();
System.out.println("iob average is " + v);
Double dnums[] = {1.1,2.2,3.3,4.4,5.5};
Stats<Double> dob = new Stats<>(dnums);
double w = dob.average();
System.out.println("dob average is " + w);
}
} 注意现在使用下面这行代码声明Stats的方式:
public class Stats<T extends Number> {......}
现在使用Number对类型T进行了限定,java编译器知道所有T类型的对象都可以调用doubleValue()方法,因为该方法是由Number声明的。