Java参数签名解析

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

最佳答案

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

abstract Number f(T j);

A类中的方法

public Number f(Float j);

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

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

被调用。

关于Java参数签名解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13324830/

相关文章:

java - 如何让我的目录为将由我的 Java 程序创建的脚本文件提供可执行权限?

java - 不使用Spring等时如何将Swing GUI与业务逻辑分离

带有 super 关键字的 Java 泛型方法

c# - IEnumerable FirstOrEmpty 扩展

c# - 基于key的KeyValueComparer

java - 使用 feign 形成多部分文件

java - SQLite ID 列和 onItemLongClick

java - Java中的队列操作

java - 寻找设计模式和列表来存储多种类型(对象和整数)

java - 用于从文件列表中选择带有 2 个点的文件名的正则表达式