提到的两个例子泛型有什么区别?

时间:2016-11-21 06:04:47

标签: java generics

我正在学习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扩展。如果我错了,请指导我。

1 个答案:

答案 0 :(得分:2)

当您说X extends Object时,这要求XObject的子类(通常是安全的假设)。当您说X extends Number时,该类型必须是更具体的Number类型。

Object没有doubleValue()方法。 Number确实有Number.doubleValue()这就是为什么有效。