最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)

類A是類B的父類,G<A>和G<B>二者不具有子父類關(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不具有子父類關(guān)系
?? ??? ?List<Object> list1=null;
?? ??? ?List<String> list2=null;
?? ??? ?
?? ??? ?//編譯不通過(guò)
?? ??? ?list1=list2;
?? ??? ?
?? ??? ?show(list1);
?? ??? ?//編譯不通過(guò)
?? ??? ?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;//編譯通過(guò)
        list2=list3;//編譯通過(guò)
    }

通配符的使用

通配符?

類A是類B的父類,G<A>和G<B>是沒(méi)有關(guān)系的,二者共同父類是: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ù)類型為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ò)
?? ??? ?
?? ??? ?//獲取:允許讀取數(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存儲(chǔ)的是A和A的子類
 ? super Person:
        G<? super A>可以作為G<A>和G<B>的父類,其中,B是A的父類

G存儲(chǔ)的是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; //編譯通過(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類 

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類型對(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類型對(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)文章

  • 將java程序打包成可執(zhí)行文件的實(shí)現(xiàn)方式

    將java程序打包成可執(zhí)行文件的實(shí)現(xiàn)方式

    本文介紹了將Java程序打包成可執(zhí)行文件的三種方法:手動(dòng)打包(將編譯后的代碼及JRE運(yùn)行環(huán)境一起打包),使用第三方打包工具(如Launch4j)和JDK自帶工具(jpackage),每種方法都有其優(yōu)缺點(diǎn),可根據(jù)實(shí)際需求選擇合適的方式
    2025-02-02
  • java 繼承訪問(wèn)成員變量代碼實(shí)例

    java 繼承訪問(wèn)成員變量代碼實(shí)例

    這篇文章主要介紹了java 繼承訪問(wèn)成員變量代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 解決問(wèn)題:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources

    解決問(wèn)題:Failed to execute goal org.apache.m

    這篇文章主要給大家介紹了關(guān)于解決問(wèn)題:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources的相關(guān)資料,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • spring cloud 分布式鏈路追蹤的方法

    spring cloud 分布式鏈路追蹤的方法

    這篇文章主要介紹了spring cloud 分布式鏈路追蹤的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Idea如何查看Maven依賴樹(shù)

    Idea如何查看Maven依賴樹(shù)

    這篇文章主要介紹了Idea如何查看Maven依賴樹(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 利用Java理解sql的語(yǔ)法(實(shí)例講解)

    利用Java理解sql的語(yǔ)法(實(shí)例講解)

    下面小編就為大家分享一篇利用Java理解sql的語(yǔ)法(實(shí)例講解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Elasticsearch 基礎(chǔ)介紹及索引原理分析

    Elasticsearch 基礎(chǔ)介紹及索引原理分析

    這篇文章主要介紹了Elasticsearch 基礎(chǔ)介紹及索引原理分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 使用@TableField(updateStrategy=FieldStrategy.IGNORED)遇到的坑記錄

    使用@TableField(updateStrategy=FieldStrategy.IGNORED)遇到的坑記錄

    這篇文章主要介紹了使用@TableField(updateStrategy=FieldStrategy.IGNORED)遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Scala之文件讀取、寫(xiě)入、控制臺(tái)操作的方法示例

    Scala之文件讀取、寫(xiě)入、控制臺(tái)操作的方法示例

    這篇文章主要介紹了Scala之文件讀取、寫(xiě)入、控制臺(tái)操作的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • SpringBoot實(shí)現(xiàn)固定和動(dòng)態(tài)定時(shí)任務(wù)的三種方法

    SpringBoot實(shí)現(xiàn)固定和動(dòng)態(tài)定時(shí)任務(wù)的三種方法

    定時(shí)器是我們項(xiàng)目中經(jīng)常會(huì)用到的,本文主要介紹了SpringBoot實(shí)現(xiàn)固定和動(dòng)態(tài)定時(shí)任務(wù)的三種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評(píng)論

娱乐| 临沧市| 泾川县| 随州市| 普兰店市| 涟水县| 洱源县| 隆回县| 山阴县| 板桥市| 莒南县| 花垣县| 准格尔旗| 武宁县| 铜川市| 成安县| 襄汾县| 即墨市| 南漳县| 衢州市| 铜梁县| 微山县| 威海市| 长岭县| 游戏| 绥棱县| 宕昌县| 南华县| 梓潼县| 武宣县| 姜堰市| 定结县| 泾川县| 阜阳市| 南靖县| 鹿泉市| 湘潭县| 会宁县| 若尔盖县| 霍城县| 蒙山县|