欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java泛型通配符的使用詳解

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

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

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

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

類A是類B的父類,A<G>是B<G>的父類

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

通配符的使用

通配符?

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

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

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

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

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

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

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

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

        G存儲的是A和A的子類
 ? super Person:
        G<? super A>可以作為G<A>和G<B>的父類,其中,B是A的父類

G存儲的是A和A的父類

@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; //編譯通過
?? ??? ?list1=list4; //編譯通過
?? ??? ?list1=list5; //編譯不通過
?? ??? ?
?? ??? ?list2=list3; //編譯不通過
?? ??? ?list2=list4; //編譯通過
?? ??? ?list2=list5; //編譯通過
?? ??? ?
?? ??? ?//讀取數(shù)據(jù)
?? ??? ?list1=list3;
?? ??? ?Person p = list1.get(0); //編譯通過
?? ??? ?Student st=list1.get(0); //編譯不通過
?? ??? ?
?? ??? ?list2=list4;
?? ??? ?Object obj = list2.get(0); //編譯通過
?? ??? ?Person obj2=list2.get(0); //編譯不通過
?? ??? ?
?? ??? ?//寫入數(shù)據(jù)
?? ??? ?list1.add(new Student()); //編譯不通過
?? ??? ?
?? ??? ?list2.add(new Person()); //編譯通過
?? ??? ?list2.add(new Student()); //編譯通過
?? ?}

自定義泛型的測試

User類 

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類

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
?
/**
?* 定義泛型類DAO<T>
?* 創(chuàng)建一下方法
?* public void save(String id ,T entity):保存T類型對象到Map變量中
?* public T get(String id):從map中獲取id對應(yīng)的對象
?* public void update(String id,T entity):替換map中key為id的內(nèi)容,改為entity對象
?* public List<T> list():返回map中存放的所有T對象
?* public void delete (String id):刪除指定id對象
?*?
?* @author CharlieLiang
?* @param <T>
?*
?*/
public class DAO<T> {
?
?? ?private Map<String,T> map;
?? ?
?? ?public DAO() {
?? ??? ?map=new HashMap<>();
?? ?}
?? ?
?? ?//保存T類型對象到Map變量中
?? ?public void save(String id ,T entity) {
?? ??? ?map.put(id, entity);
?? ?}
?? ?
?? ?//從map中獲取id對應(yīng)的對象
?? ?public T get(String id) {
?? ??? ?return map.get(id);
?? ?}
?? ?
?? ?//替換map中key為id的內(nèi)容,改為entity對象
?? ?public void update(String id,T entity) {
?? ??? ?if(map.containsKey(id)) {
?? ??? ??? ?map.put(id, entity);
?? ??? ?}
?? ?}
?? ?
?? ?//返回map中存放的所有T對象
?? ?public List<T> list(){
?? ??? ?//錯誤的
//?? ??? ?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對象
?? ?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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

    Java中的時間日期API知識點總結(jié)

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

    MyBatis中resultType屬性的使用

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

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

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

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

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

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

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

    MyBatis的 config.xml標簽

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

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

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

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

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

最新評論