Java参数签名解析

ᆼᆺᆼ*_*ᆼᆺᆼ 1 java oop generics inheritance

为什么这段代码打印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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Wil*_*lem 6

你在期待什么 您只有一个在B类中声明的方法:

abstract Number f(T j);
Run Code Online (Sandbox Code Playgroud)

A类中的方法

public Number f(Float j);
Run Code Online (Sandbox Code Playgroud)

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

public Number f(T j) {
    return j;
}
Run Code Online (Sandbox Code Playgroud)

被叫.