Java:Genrics - 两个相似的代码,一个不起作用

时间:2016-09-11 06:57:09

标签: java generics

以下代码无效:

    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));
    }
}

有什么区别?在这两个程序中,我试图调用参数类型与调用对象的参数类型不同的方法

1 个答案:

答案 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调用重命名的方法,则第二个代码段会产生相同的错误。