以下代码无效:
class Stats<T extends Number>
{
T[] nums;
Stats(T[] o)
{
nums = o;
}
double average()
{
double sum = 0.0;
for(int i=0; i < nums.length; i++)
sum += nums[i].doubleValue();
return sum / nums.length;
}
boolean sameAvg(Stats<T> ob)
{
if(average() == ob.average())
return true;
return false;
}
}
class BoundsDemo
{
public static void main(String args[])
{
Integer inums[] = { 1, 2, 3, 4, 5 };
Stats<Integer> iob = new Stats<Integer>(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<Double>(dnums);
double w = dob.average();
System.out.println("dob average is " + w);
if(iob.sameAvg(dob))
System.out.println("Averages are the same.");
else
System.out.println("Averages differ.");
}
}
但是,以下工作:
class Gen04<T extends Number>
{
T num;
void set(T a)
{
num = a;
}
T get()
{
return num;
}
boolean equals(Gen04<T> ob)
{
if(num.doubleValue() == ob.get().doubleValue())
return true;
else
return false;
}
}
class GenericCompare
{
public static void main(String args[])
{
Gen04<Integer> obI1 = new Gen04<Integer>();
obI1.set(new Integer(5));
Gen04<Double> obI2 = new Gen04<Double>();
obI2.set(new Double(5.0));
System.out.println("obI1 and obI2 are equal = "+obI1.equals(obI2));
}
}
有什么区别?在这两个程序中,我试图调用参数类型与调用对象的参数类型不同的方法
答案 0 :(得分:2)
在第一个代码段中,在iob.sameAvg(dob)
中,您尝试将Stats<Double>
实例传递给Stats<Integer>
的方法,该方法需要Stats<Integer>
个参数。由于Stats<Double>
不是Stats<Integer>
的子类,编译器不接受它。
在第二个代码段中,您拨打obI1.equals(obI2)
。 equals
是一个接受Object
参数的Object
类的方法,因此您可以将任何Object
实例传递给它。
equals(Gen04<T> ob)
方法重载Object
的{{1}},但该方法未被调用。相反,编译器选择equals
类的equals(Object other)
方法。如果您重命名Object
方法并从equals
调用重命名的方法,则第二个代码段会产生相同的错误。