老哥们, Java 范型这两个写法是等效的吗?一般用哪种?

2021-12-03 20:46:39 +08:00
 Liyiw
    static <T extends Number> void showBox1(Box<T> box) {
        T number = box.get();
        System.out.println(number);
    }

    static void showBox2(Box<? extends Number> box) {
        Number number = box.get();
        System.out.println(number);
    }

1269 次点击
所在节点    问与答
2 条回复
huijiewei
2021-12-03 22:04:07 +08:00
如果只是参数里面泛型用第二种即可

如果返回值有泛型就要用到第一种了
aguesuka
2021-12-04 10:41:37 +08:00
在你的例子中是等效的;
作为方法签名的话, 有一个微妙区别, 第一个方法可以写出以下代码, 而第二个不行;
// 假如 box 有一个 void set(E e);的方法
box.set(box.get());

语义上, 第一个是方法的泛型参数(类型作为类型), 而第二个是通配符泛型类型(只是类型)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/819905

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX