1

为什么此代码打印 2.0 而不是 1.0?

abstract class B<T extends Number> {
    abstract Number f(T j);
}

class A<T extends Number> extends B<T> {
    public Number f(Float j) {
        return 1f;
    }

    public Number f(T j) {
        return j;
    }
}

public class J {
    public static void main(String[] args) {
        B<Float> a = new A<>();
        Number r = a.f(2f);
        System.out.println(r);
    }
}
4

4 回答 4

6

你在期待什么。您在 B 类中只声明了一种方法:

abstract Number f(T j);

A类中的方法

public Number f(Float j);

不会覆盖前者。他们有不同的签名。所以方法

public Number f(T j) {
    return j;
}

被调用。

于 2012-11-10T18:29:06.323 回答
2

所以这里问题的核心是你已经将变量声明a为 type B。由于B该类只有一种方法,因此那是获胜的方法。但是,在您的 中main,如果您将类型更改a为 type A,您会注意到它不会编译,因为它是模棱两可的。但是,如果您确实将类中的方法更改A为接受原语,并且在main()方法中将变量定义a为 type A,则会导致1.0. 即,以下将导致打印1.0

class A<T extends Number> extends B<T> {
    public Number f(float j) {
        return 1f;
    }

    public Number f(T j) {
        return j;
    }
}


public class J {
    public static void main(String[] args) {
        A<Float> a = new A<>();
        Number r = a.f(2f);
        System.out.println(r);
    }
}
于 2012-11-10T19:06:39.300 回答
1

在您下面的代码中

abstract class B<T extends Number> {
 abstract Number f(T j);
}

class A<T extends Number> extends B<T> {
    public Number f(Float j) //this method does not override the superclass method

    {
        return 1f;
    }

    public Number f(T j) {
        return j;
    }
}

public class J {
    public static void main(String[] args) {
        B<Float> a = new A<>();
        Number r = a.f(2f);
        System.out.println(r);
    }
}

当调用 af(2f) 时,它会调用

public Number f(T j)
{
return j;
}

返回 j 因此提供的输出是 2.0

于 2012-11-10T18:36:48.837 回答
0

float不是一回事Float

自动装箱使其感觉相同,但一个主要区别是您不能将 a 传递nullfloat参数。

我建议@Override在覆盖的方法上使用注释,这样编译器会告诉你签名是否正确

于 2012-11-10T19:14:02.730 回答