亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java泛型通配符的使用詳解

 更新時(shí)間:2023年01月13日 09:40:39   作者:乘乘涼  
本文主要介紹了Java泛型通配符的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

泛型在繼承方面的體現(xiàn)

類(lèi)A是類(lèi)B的父類(lèi),G<A>和G<B>二者不具有子父類(lèi)關(guān)系,二者是并列關(guān)系

@Test
?? ?public void test1() {
?? ??? ?Object obj=null;
?? ??? ?String str=null;
?? ??? ?obj=str;//編譯通過(guò)
?? ??? ?
?? ??? ?Object[] arr1=new Object[10];
?? ??? ?String arr2[]=new String[10];
?? ??? ?arr1=arr2;//編譯通過(guò)
?? ??? ?
?? ??? ?//此時(shí)的list1和list2不具有子父類(lèi)關(guān)系
?? ??? ?List<Object> list1=null;
?? ??? ?List<String> list2=null;
?? ??? ?
?? ??? ?//編譯不通過(guò)
?? ??? ?list1=list2;
?? ??? ?
?? ??? ?show(list1);
?? ??? ?//編譯不通過(guò)
?? ??? ?show(list2);
?? ?}
?? ?
?? ?public void show(List<Object> list) {
?? ??? ?
?? ?}

類(lèi)A是類(lèi)B的父類(lèi),A<G>是B<G>的父類(lèi)

@Test
    public void test2() {
        AbstractList<String> list1=null;
        List<String> list2=null;
        ArrayList<String>list3=null;
        
        list1=list3;//編譯通過(guò)
        list2=list3;//編譯通過(guò)
    }

通配符的使用

通配符?

類(lèi)A是類(lèi)B的父類(lèi),G<A>和G<B>是沒(méi)有關(guān)系的,二者共同父類(lèi)是:G<?> 

    @Test
    public void test4() {
        List<Object> list1=null;
        List<String> list2=null;
        
        List<?> list=null;
        
        list=list1;//編譯通過(guò)
        list=list2;//編譯通過(guò)
        print(list1);//編譯通過(guò)
        print(list2);//編譯通過(guò)
    }
    
    public void print(List<?> list) {
        Iterator<?> it=list.iterator();
        while(it.hasNext()) {
            Object obj=it.next();
            System.out.println(obj);
        }
    }

使用通配符后,數(shù)據(jù)的寫(xiě)入和讀取要求

添加:對(duì)于List<?>就不能向其內(nèi)部添加數(shù)據(jù),除了添加null之外

獲?。涸试S讀取數(shù)據(jù),讀取的數(shù)據(jù)類(lèi)型為Object

@Test
?? ?public void test5() {
?? ??? ?List<?> list=null;
?? ??? ?List<String> list3=new ArrayList<>();
?? ??? ?list3.add("AAA");
?? ??? ?list3.add("BBB");
?? ??? ?list3.add("CCC");
?? ??? ?
?? ??? ?list=list3;
?? ??? ?//添加:對(duì)于List<?>就不能向其內(nèi)部添加數(shù)據(jù)。
?? ??? ?//除了添加null之外
?? ??? ?
?? ??? ?list.add("DD"); //編譯不通過(guò)
?? ??? ?list.add("?");?? ?//編譯不通過(guò)
?? ??? ?
?? ??? ?list.add(null);?? ?//編譯通過(guò)
?? ??? ?
?? ??? ?//獲?。涸试S讀取數(shù)據(jù),讀取的數(shù)據(jù)類(lèi)型為Object
?? ??? ?Object obj = list.get(0);
?? ??? ?System.out.println(obj);
?? ?}

 有限制條件的通配符的使用

 ? extends A:
       G<? extends A>可以作為G<A>和G<B>的父類(lèi),其中,B是A的子類(lèi)

        G存儲(chǔ)的是A和A的子類(lèi)
 ? super Person:
        G<? super A>可以作為G<A>和G<B>的父類(lèi),其中,B是A的父類(lèi)

G存儲(chǔ)的是A和A的父類(lèi)

@Test
?? ?public void test6() {
?? ??? ?List<? extends Person> list1=null;
?? ??? ?List<? super Person> list2=null;
?? ??? ?
?? ??? ?List<Student> list3=new ArrayList<>();
?? ??? ?List<Person> list4=new ArrayList<>();;
?? ??? ?List<Object> list5=new ArrayList<>();;
?? ??? ?
?? ??? ?list1=list3; //編譯通過(guò)
?? ??? ?list1=list4; //編譯通過(guò)
?? ??? ?list1=list5; //編譯不通過(guò)
?? ??? ?
?? ??? ?list2=list3; //編譯不通過(guò)
?? ??? ?list2=list4; //編譯通過(guò)
?? ??? ?list2=list5; //編譯通過(guò)
?? ??? ?
?? ??? ?//讀取數(shù)據(jù)
?? ??? ?list1=list3;
?? ??? ?Person p = list1.get(0); //編譯通過(guò)
?? ??? ?Student st=list1.get(0); //編譯不通過(guò)
?? ??? ?
?? ??? ?list2=list4;
?? ??? ?Object obj = list2.get(0); //編譯通過(guò)
?? ??? ?Person obj2=list2.get(0); //編譯不通過(guò)
?? ??? ?
?? ??? ?//寫(xiě)入數(shù)據(jù)
?? ??? ?list1.add(new Student()); //編譯不通過(guò)
?? ??? ?
?? ??? ?list2.add(new Person()); //編譯通過(guò)
?? ??? ?list2.add(new Student()); //編譯通過(guò)
?? ?}

自定義泛型的測(cè)試

User類(lèi) 

public class User {
?
?? ?@Override
?? ?public int hashCode() {
?? ??? ?final int prime = 31;
?? ??? ?int result = 1;
?? ??? ?result = prime * result + age;
?? ??? ?result = prime * result + id;
?? ??? ?result = prime * result + ((name == null) ? 0 : name.hashCode());
?? ??? ?return result;
?? ?}
?? ?@Override
?? ?public boolean equals(Object obj) {
?? ??? ?if (this == obj)
?? ??? ??? ?return true;
?? ??? ?if (obj == null)
?? ??? ??? ?return false;
?? ??? ?if (getClass() != obj.getClass())
?? ??? ??? ?return false;
?? ??? ?User other = (User) obj;
?? ??? ?if (age != other.age)
?? ??? ??? ?return false;
?? ??? ?if (id != other.id)
?? ??? ??? ?return false;
?? ??? ?if (name == null) {
?? ??? ??? ?if (other.name != null)
?? ??? ??? ??? ?return false;
?? ??? ?} else if (!name.equals(other.name))
?? ??? ??? ?return false;
?? ??? ?return true;
?? ?}
?? ?@Override
?? ?public String toString() {
?? ??? ?return "User [id=" + id + ", age=" + age + ", name=" + name + "]";
?? ?}
?? ?public int getId() {
?? ??? ?return id;
?? ?}
?? ?public void setId(int id) {
?? ??? ?this.id = id;
?? ?}
?? ?public int getAge() {
?? ??? ?return age;
?? ?}
?? ?public void setAge(int age) {
?? ??? ?this.age = age;
?? ?}
?? ?public String getName() {
?? ??? ?return name;
?? ?}
?? ?public void setName(String name) {
?? ??? ?this.name = name;
?? ?}
?? ?public User() {
?? ??? ?
?? ?}
?? ?private int id;
?? ?public User(int id, int age, String name) {
?? ??? ?super();
?? ??? ?this.id = id;
?? ??? ?this.age = age;
?? ??? ?this.name = name;
?? ?}
?? ?private int age;
?? ?private String name;
}

 DAO類(lèi)

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
?
/**
?* 定義泛型類(lèi)DAO<T>
?* 創(chuàng)建一下方法
?* public void save(String id ,T entity):保存T類(lèi)型對(duì)象到Map變量中
?* public T get(String id):從map中獲取id對(duì)應(yīng)的對(duì)象
?* public void update(String id,T entity):替換map中key為id的內(nèi)容,改為entity對(duì)象
?* public List<T> list():返回map中存放的所有T對(duì)象
?* public void delete (String id):刪除指定id對(duì)象
?*?
?* @author CharlieLiang
?* @param <T>
?*
?*/
public class DAO<T> {
?
?? ?private Map<String,T> map;
?? ?
?? ?public DAO() {
?? ??? ?map=new HashMap<>();
?? ?}
?? ?
?? ?//保存T類(lèi)型對(duì)象到Map變量中
?? ?public void save(String id ,T entity) {
?? ??? ?map.put(id, entity);
?? ?}
?? ?
?? ?//從map中獲取id對(duì)應(yīng)的對(duì)象
?? ?public T get(String id) {
?? ??? ?return map.get(id);
?? ?}
?? ?
?? ?//替換map中key為id的內(nèi)容,改為entity對(duì)象
?? ?public void update(String id,T entity) {
?? ??? ?if(map.containsKey(id)) {
?? ??? ??? ?map.put(id, entity);
?? ??? ?}
?? ?}
?? ?
?? ?//返回map中存放的所有T對(duì)象
?? ?public List<T> list(){
?? ??? ?//錯(cuò)誤的
//?? ??? ?Collection<T> values = map.values();
//?? ??? ?return (List<T>) values;
?? ??? ?//正確的
?? ??? ?List<T> list=new ArrayList<>();
?? ??? ?Collection<T> values = map.values();
?? ??? ?for(T t:values) {
?? ??? ??? ?list.add(t);
?? ??? ?}
?? ??? ?return list;
?? ?}
?? ?
?? ?//刪除指定id對(duì)象
?? ?public void delete (String id) {
?? ??? ?map.remove(id);
?? ?}
}

DAOTest

import java.util.List;
?
import org.junit.jupiter.api.Test;
?
public class DAOTest {
?
?? ?@Test
?? ?public void testList() {
?? ??? ?DAO<User> dao = new DAO<>();
?? ??? ?dao.save("1001", new User(1001,34,"周杰倫"));
?? ??? ?dao.save("1002", new User(1002,20,"昆凌"));
?? ??? ?dao.save("1003", new User(1002,20,"蔡依林"));
?? ??? ?
?? ??? ?List<User> list = dao .list();
?? ??? ?list.forEach( i->System.out.println(i));
?? ??? ?
?? ?}
?? ?
?? ?@Test
?? ?public void testUpdate() {
?? ??? ?DAO<User> dao = new DAO<>();
?? ??? ?dao.save("1001", new User(1001,34,"周杰倫"));
?? ??? ?dao.save("1002", new User(1002,20,"昆凌"));
?? ??? ?dao.save("1003", new User(1002,20,"蔡依林"));
?? ??? ?
?? ??? ?dao.update("1003", new User(1003,40,"方文山"));
?? ??? ?
?? ??? ?List<User> list=dao.list();
?? ??? ?list.forEach(i->System.out.println(i));
?? ?}
?? ?
?? ?@Test
?? ?public void testDelete() {
?? ??? ?DAO<User> dao = new DAO<>();
?? ??? ?dao.save("1001", new User(1001,34,"周杰倫"));
?? ??? ?dao.save("1002", new User(1002,20,"昆凌"));
?? ??? ?dao.save("1003", new User(1002,20,"蔡依林"));
?? ??? ?
?? ??? ?dao.delete("1003");
?? ??? ?
?? ??? ?List<User> list=dao.list();
?? ??? ?list.forEach(i->System.out.println(i));
?? ?}
}

到此這篇關(guān)于Java泛型通配符的使用詳解的文章就介紹到這了,更多相關(guān)Java泛型通配符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea中l(wèi)ombok的用法

    idea中l(wèi)ombok的用法

    lombok是開(kāi)源的代碼生成庫(kù),是一款非常實(shí)用的小工具,在更改實(shí)體類(lèi)時(shí)只需要修改屬性即可,減少了很多重復(fù)代碼的編寫(xiě)工作,今天小編給大家介紹idea中l(wèi)ombok的用法,感興趣的朋友一起看看吧
    2021-12-12
  • SpringBoot2.X整合Spring-Cache緩存開(kāi)發(fā)的實(shí)現(xiàn)

    SpringBoot2.X整合Spring-Cache緩存開(kāi)發(fā)的實(shí)現(xiàn)

    本文主要介紹了SpringBoot2.X整合Spring-Cache緩存開(kāi)發(fā)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java中的時(shí)間日期API知識(shí)點(diǎn)總結(jié)

    Java中的時(shí)間日期API知識(shí)點(diǎn)總結(jié)

    本文給大家總結(jié)了Java中的時(shí)間日期API知識(shí)點(diǎn)以及相關(guān)的實(shí)例代碼分享,有興趣的朋友參考學(xué)習(xí)下。
    2018-04-04
  • MyBatis中resultType屬性的使用

    MyBatis中resultType屬性的使用

    這篇文章主要介紹了MyBatis中resultType屬性的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 淺談@Value和@Bean的執(zhí)行順序問(wèn)題

    淺談@Value和@Bean的執(zhí)行順序問(wèn)題

    這篇文章主要介紹了@Value和@Bean的執(zhí)行順序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java并發(fā)編程如何降低鎖粒度并實(shí)現(xiàn)性能優(yōu)化

    Java并發(fā)編程如何降低鎖粒度并實(shí)現(xiàn)性能優(yōu)化

    這篇文章主要介紹了Java并發(fā)編程如何降低鎖粒度并實(shí)現(xiàn)性能優(yōu)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java使用EasyExcel實(shí)現(xiàn)Sheet的復(fù)制與填充

    java使用EasyExcel實(shí)現(xiàn)Sheet的復(fù)制與填充

    EasyExcel是一個(gè)非常有用的工具,它提供了強(qiáng)大的模板填充功能,可以輕松解決各種業(yè)務(wù)需求,本文主要為大家介紹了如何使用EasyExcel實(shí)現(xiàn)模板Sheet復(fù)制與填充,需要的可以參考下
    2023-10-10
  • MyBatis的 config.xml標(biāo)簽

    MyBatis的 config.xml標(biāo)簽

    這篇文章主要介紹了MyBatis的 config.xml標(biāo)簽的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • Spring的編程式事務(wù)和聲明式事務(wù)詳解

    Spring的編程式事務(wù)和聲明式事務(wù)詳解

    這篇文章主要介紹了Spring的編程式事務(wù)和聲明式事務(wù)的相關(guān)內(nèi)容,涉及Spring事務(wù)屬性、Spring事務(wù)的基本類(lèi)等知識(shí),需要的朋友可以了解下。
    2017-09-09
  • AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊(duì)管理

    AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊(duì)管理

    這篇文章主要介紹了為大家AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊(duì)管理源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論