我正在学习java中的泛型。我对下面提到的2个样本有点困惑。样本一是
public class TrickyName <X extends Object>{
private X x;
public TrickyName(X x) {
this.x = x;
}
private double getDouble() {
return x.doubleValue();
}
public static void main(String args[]) {
TrickyName<Integer> a = new TrickyName<Integer>(new Integer(1));
System.out.print(a.getDouble());
}
}
样本2
public class TrickyName <X extends Number>{
private X x;
public TrickyName(X x) {
this.x = x;
}
private double getDouble() {
return x.doubleValue();
}
public static void main(String args[]) {
TrickyName<Integer> a = new TrickyName<Integer>(new Integer(1));
System.out.print(a.getDouble());
}
}
在提到的示例中,只有扩展类的差异。在第一个示例中,我在从Number扩展的第二个示例中扩展Object。我理解的是X extends Object意味着任何扩展对象的东西(因为每个类扩展对象)都可以使用,所以这里使用Integer类,并且在第一个示例中的getDouble()中给出了编译错误但是当我从Number类扩展时如上所述在第二个样本中它起作用。为什么会这样? Number类和integer类都从Object扩展。如果我错了,请指导我。
答案 0 :(得分:2)
当您说X extends Object
时,这要求X
是Object
的子类(通常是安全的假设)。当您说X extends Number
时,该类型必须是更具体的Number
类型。
Object
没有doubleValue()
方法。 Number
确实有Number.doubleValue()
这就是为什么有效。