<? Super T> and <? Extend T>的区别? 推荐| Java Debug 笔记

523 阅读3分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

<? Super T> and <? Extend T>的区别?

List<? super T>和之间有什么区别List<? extends T>?

我曾经使用List<? extends T>,但是它不允许我向其中添加元素list.add(e),而List<? super T>确实可以。

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

想象一下拥有这种等级制度

图片.png 在此处输入图片说明 1.extend

通过写

List<? extends C2> list;

您说这list将能够引用类型(例如)的对象,该对象的ArrayList泛型类型是(包括)的7个子类型之一:C2C2

C2: new ArrayList<C2>();,(可以存储C2或子类型的对象)或
D1: new ArrayList<D1>();,(可以存储D1或子类型的对象)或
D2: new ArrayList<D2>();,(可以存储D2或子类型的对象)或...

等等。七种不同的情况:

1) new ArrayList<C2>(): can store C2 D1 D2 E1 E2 E3 E4
2) new ArrayList<D1>(): can store    D1    E1 E2  
3) new ArrayList<D2>(): can store       D2       E3 E4
4) new ArrayList<E1>(): can store          E1             
5) new ArrayList<E2>(): can store             E2             
6) new ArrayList<E3>(): can store                E3             
7) new ArrayList<E4>(): can store                   E4             

对于每种可能的情况,我们都有一组“可存储”类型:7个(红色)组以图形表示

图片.png

在此处输入图片说明

如您所见,没有每种情况都通用的安全类型:

你不能,list.add(new C2(){});因为它可能是list = new ArrayList<D1>();
你不能,list.add(new D1(){});因为它可能是list = new ArrayList<D2>();

等等。

2.super

通过写

List<? super C2> list;

您说这list将能够引用类型(例如)的对象,该对象的ArrayList泛型类型是(包括)的7个超类型之一:

A1: new ArrayList<A1>();,(可以存储A1或子类型的对象)或
A2: new ArrayList<A2>();,(可以存储A2或子类型的对象)或
A3: new ArrayList<A3>();,(可以存储A3或子类型的对象)或...

等等。七种不同的情况:

1) new ArrayList<A1>(): can store A1          B1 B2       C1 C2    D1 D2 E1 E2 E3 E4
2) new ArrayList<A2>(): can store    A2          B2       C1 C2    D1 D2 E1 E2 E3 E4
3) new ArrayList<A3>(): can store       A3          B3       C2 C3 D1 D2 E1 E2 E3 E4
4) new ArrayList<A4>(): can store          A4       B3 B4    C2 C3 D1 D2 E1 E2 E3 E4
5) new ArrayList<B2>(): can store                B2       C1 C2    D1 D2 E1 E2 E3 E4
6) new ArrayList<B3>(): can store                   B3       C2 C3 D1 D2 E1 E2 E3 E4
7) new ArrayList<C2>(): can store                            C2    D1 D2 E1 E2 E3 E4

对于每种可能的情况,我们都有一组“可存储”类型:7个(红色)组以图形表示

图片.png

在此处输入图片说明

正如你所看到的,在这里我们有七个安全类型是共同的每一种情况下:C2,D1,D2,E1,E2,E3,E4。

您可以这样,list.add(new C2(){});因为无论我们引用的C2是哪种列表,都可以使用
您可以这样,list.add(new D1(){});因为无论我们引用的D1是哪种列表,都可以使用

等等。您可能已经注意到,这些类型与从type开始的层次结构相对应C2。 笔记

如果您想进行一些测试,这里是完整的层次结构

interface A1{}
interface A2{}
interface A3{}
interface A4{}

interface B1 extends A1{}
interface B2 extends A1,A2{}
interface B3 extends A3,A4{}
interface B4 extends A4{}

interface C1 extends B2{}
interface C2 extends B2,B3{}
interface C3 extends B3{}

interface D1 extends C1,C2{}
interface D2 extends C2{}

interface E1 extends D1{}
interface E2 extends D1{}
interface E3 extends D2{}
interface E4 extends D2{}

文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/4…

作者建议: 真的没想到,之前在一个译文中,涉及到了泛型,我就简单讲了一下关于<? Super T> and <? Extend T>的区别,我理解的比较通俗,望轻喷

既然已经提到泛型了,就简单扩展一下

"<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类"

  public <T extends Comparable<? super T>> int[] sort(T[] a) {
        return sort(a, null);
    }

简单举例:假如?代表一个类Hand 它有一个父类Person 那么我们去比较一个属性,它有可能时Hand的属性,也有可能是Person的属性,方便扩展。

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️