Java 的 <T> T get(List<? extends T> i) 怎么理解?和 <T> T get(List<T> i) 有啥不同?

2018-12-05 23:38:37 +08:00
 lhx2008

Collections 里面有一段代码

    private static <T> T get(ListIterator<? extends T> i, int index) {
        T obj = null;
        int pos = i.nextIndex();
        if (pos <= index) {
            do {
                obj = i.next();
            } while (pos++ < index);
        } else {
            do {
                obj = i.previous();
            } while (--pos > index);
        }
        return obj;
    }

他这里用了 <T> T get(ListIterator<? extends T> i) 我有点不理解,因为 T 就是传入的 ListIterator 的泛型定的,根本没有再向下转型的可能了。

所以应该和 <T> T get(ListIterator<T> i) 是一样的,那为什么要多此一举呢?

3602 次点击
所在节点    Java
28 条回复
lhx2008
2018-12-06 09:31:36 +08:00
@wqlin 但是 T 不是你想定就定的,是按第一个参数的泛型定的

你传 copy (List<Object> ,List<Integer>) ,T 就是 Object
你传 copy(List<Number>, List<Integer> ),T 就是 Number

都没有问题
szq8014
2018-12-06 09:33:47 +08:00
协变 & 逆变 +1
wqlin
2018-12-06 09:40:05 +08:00
@lhx2008 我到没怎么用过 Collections 中的 get 函数,只是表达下 T 和 ? super T 区别。不过为啥是第一个参数而不是第二个参数?
Foredoomed
2018-12-06 09:42:08 +08:00
super 的作用并不是你能放什么类型在这个集合里,而是指定了集合的引用类型,具体的自己网上搜吧。
LucasLee92
2018-12-06 09:43:11 +08:00
@lhx2008 两个例子不都是用父类来接受子类,java oo 思想的一种表现
ZiLong
2018-12-06 10:28:18 +08:00
@lhx2008 恩,这个链接解释的还是蛮清楚的
Raymon111111
2018-12-06 10:36:04 +08:00
可以传 Integer 返回 Number 啊
FrankFang128
2018-12-06 13:54:38 +08:00
@lhx2008 List<T> 只能把元素当做 T 操作,List<? extends T> 可以把元素当做 T 的子类操作,还是不一样的

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

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

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

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

© 2021 V2EX