Dangerous-Excuse4836 | 1 points | Nov 02 2021 11:55:43

Java 容器添加泛型限定后存在不可修改容器元素的情况 的通俗解释

之前在网上找也没个好解释 后来想了下应该是这个原因 然后把这个回答发知乎没人关注 这里发出来验证下这个通俗解释合不合理

class Person {
    String name;
    Person(String name){
        this.name=name;
    }
}

class Student extends Person{   
    Student(String name){
        super(name);
    }
}

ArrayList<Student&rt; x=new ArrayList<Student&rt;();
x.add(new Student("001"));
ArrayList <? extends Person&rt; s1=x;
sop(s1.get(0).name);//可行 泛型上限将泛型类中泛型成员转为上限超类存储
//s1.add(new Student("002"));//报错 设置泛型上限后无法添加/修改元素,原因:子类分支间不兼容

ArrayList<? super Student&rt; y=new ArrayList<Person&rt;();
//sop(y.get(0).name);//报错 泛型下限将泛型类中泛型成员转为Object存储
y.add(new Student("002"));//可行 设置泛型下限后可添加/修改元素,原因:超类间兼容
Student m=(Student)(y.get(0));
sop(m.name);

泛型限定的操作安全问题的原因:

①设置泛型上限后无法添加/修改元素,原因:子类分支间不兼容(无共同下限类型),若加入新元素排序时(Set/Map)存在 新元素无已存元素的成员属性导致无法比较的问题

②设置泛型下限后可添加/修改下限类型元素,原因:超类间兼容(存在共同下限类型),加入的新元素(被限定为共同下限类型)都包含已存元素的成员属性,新元素排序时(Set/Map)不存在已存元素比较方法由于新元素无指定成员属性导致无法比较的问题

[-] NoChinaNoLife | 10 points | Nov 02 2021 12:55:58

不怎么会Java,但我不太明白①是什么意思。如果只比较泛型上限类所具有的属性会出问题吗...另外这样发贴相当于把红迪账户关联到了你的知乎账户。

[-] BenjilewisC | 4 points | Nov 02 2021 21:57:24

真听不懂,能不能说英文

[-] winniepooh-197977 | 2 points | Nov 02 2021 13:09:35

第二到四行是构造方法吗

[-] Ok_Scientist_691 | 2 points | Nov 02 2021 13:59:19

編程學不進去了 完全搞不清甚麼意思 草

[-] beatmysoymeat | 2 points | Nov 02 2021 14:03:19

这好像是什么协变逆变的东西,平时基本用不到

[-] XWN_BS | 1 points | Nov 02 2021 13:30:20

Java真不熟

[-] Maxmilianbus | 1 points | Nov 02 2021 21:53:04

魔怔支那猪滚

[-] Dangerous-Excuse4836 | 2 points | Nov 02 2021 22:04:26

能不能不要如此恶毒

[-] NingChoww | 1 points | Nov 03 2021 03:57:03

抱抱