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

Java泛型在集合使用與自定義及繼承上的體現(xiàn)和通配符的使用

 更新時(shí)間:2021年09月29日 09:25:08   作者:葉綠體不忘呼吸  
泛型又稱(chēng)參數(shù)化類(lèi)型,是Jdk5.0 出現(xiàn)的新特性,解決數(shù)據(jù)類(lèi)型的安全性問(wèn)題,在類(lèi)聲明或?qū)嵗瘯r(shí)只要指定好需要的具體的類(lèi)型即可。Java泛型可以保證如果程序在編譯時(shí)沒(méi)有發(fā)出警告,運(yùn)行時(shí)就不會(huì)產(chǎn)生ClassCastException異常。同時(shí),代碼更加簡(jiǎn)潔、健壯

泛型的概念

集合容器類(lèi)在設(shè)計(jì)階段/聲明階段不能確定這個(gè)容器實(shí)際存的是什么類(lèi)型的對(duì)象,所以在JDK1.5之前只能把元素類(lèi)型設(shè)計(jì)為Object,JDK1.5之后使用泛型來(lái)解決。因?yàn)檫@個(gè)時(shí)候除了元素的類(lèi)型不確定,其他的部分是確定的,例如關(guān)于這個(gè)元素如何保存,如何管理等是確定的,因此把元素的類(lèi)型設(shè)計(jì)成一個(gè)參數(shù),這個(gè)類(lèi)型參數(shù)叫做泛型。Collection<E>ArrayList<E><E>就是類(lèi)型參數(shù),即泛型。

所謂泛型,就是允許在定義類(lèi)、接口時(shí)通過(guò)一個(gè)標(biāo)識(shí)表示類(lèi)中某個(gè)屬性的類(lèi)型或者是某個(gè)方法的返回值及參數(shù)類(lèi)型。這個(gè)類(lèi)型參數(shù)將在使用時(shí)(例如,繼承或?qū)崿F(xiàn)這個(gè)接口,用這個(gè)類(lèi)型聲明變量、創(chuàng)建對(duì)象時(shí))確定(即傳入實(shí)際的類(lèi)型參數(shù),也稱(chēng)為類(lèi)型實(shí)參)。

從JDK1.5以后,Java引入了“參數(shù)化類(lèi)型(Parameterized type)”的概念,允許在創(chuàng)建集合時(shí)再指定集合元素的類(lèi)型,正如:List<String>,這表明該List只能保存字符串類(lèi)型的對(duì)象。JDK1.5改寫(xiě)了集合框架中的全部接口和類(lèi),為這些接口、類(lèi)增加了泛型支持,從而可以在聲明集合變量、創(chuàng)建集合對(duì)象時(shí)傳入類(lèi)型實(shí)參。

在這里插入圖片描述

在這里插入圖片描述

集合中使用泛型

Collection中使用泛型:

import java.util.ArrayList;
import java.util.Iterator;

/**
 * @Author: Yeman
 * @Date: 2021-09-24-15:10
 * @Description:
 */
public class GenericTest {
    public static void main(String[] args) {
    	//如下在實(shí)例化的時(shí)候在<>中填入需要的類(lèi)型即可(不可以是基本數(shù)據(jù)類(lèi)型)
        ArrayList<Integer> list = new ArrayList<>();
        list.add(99);
        list.add(0);
        list.add(121);

        //遍歷方式一
        for (Integer integer : list){
            System.out.println(integer);
        }
        System.out.println("=====================");
        //遍歷方式二
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

Map中使用泛型:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * @Author: Yeman
 * @Date: 2021-09-24-15:10
 * @Description:
 */
public class GenericTest {
    public static void main(String[] args) {
        //如下如下在實(shí)例化的時(shí)候在<>中填入需要的類(lèi)型即可(不可以是基本數(shù)據(jù)類(lèi)型)
        // 注意因?yàn)镸ap是鍵值對(duì),因此需要分別填入“鍵”和“值”所需要的類(lèi)型
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Jack",26);
        map.put("Marry",18);
        map.put("Tom",20);
        map.put("Lily",22);

        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }
}

自定義泛型結(jié)構(gòu)

1、泛型類(lèi)、泛型接口

①泛型的聲明
interface List<T>{} 、 class GenTest<K,V>{} 、class student <T extends Person> {}
其中,T,K,V不代表值,而是表示類(lèi)型。這里使用任意字母都可以,常用T表示,是Type的縮寫(xiě)。

②泛型的實(shí)例化

List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();

<>里面只能是類(lèi),不能用基本數(shù)據(jù)類(lèi)型填充,可以使用包裝類(lèi)填充。把一個(gè)集合中的內(nèi)容限制為一個(gè)特定的數(shù)據(jù)類(lèi)型,這就是Generic的核心思想。

泛型類(lèi)可能有多個(gè)參數(shù),此時(shí)可將多個(gè)參數(shù)一起放在尖括號(hào)內(nèi),如:<E1,E2,E3>

泛型類(lèi)的構(gòu)造器與非泛型一樣:public GenericClass(){},
public GenericClass<E>(){}是錯(cuò)誤的。

泛型不同的引用不能相互賦值:盡管在編譯時(shí)ArrayList<String>ArrayList<Integer>是兩種類(lèi)型,但是,在運(yùn)行時(shí)只有一個(gè)ArrayList被加載到JVM中。

在類(lèi)/接口上聲明的泛型,在本類(lèi)或本接口中即代表某種類(lèi)型,可以作為非靜態(tài)屬性的類(lèi)型、非靜態(tài)方法的參數(shù)類(lèi)型、非靜態(tài)方法的返回值類(lèi)型。但在靜態(tài)方法中不能使用類(lèi)的泛型,因?yàn)殪o態(tài)成員是隨著類(lèi)加載而加載的,而類(lèi)型的指定是在實(shí)例化時(shí)才確定的。

異常類(lèi)不能使用泛型。

不能new E[],但是可以E[] elements = (E[])new Object[capacity];

父類(lèi)有泛型,子類(lèi)可以選擇保留泛型也可以選擇指定泛型類(lèi)型,子類(lèi)除了指定或保留父類(lèi)的泛型,還可以增加自己的泛型:

class Father<T1, T2> {
}
// 子類(lèi)不保留父類(lèi)的泛型
// 1)沒(méi)有類(lèi)型 擦除
class Son1 extends Father {// 等價(jià)于class Son extends Father<Object,Object>{
}
// 2)指定類(lèi)型
class Son2 extends Father<Integer, String> {
}
// 子類(lèi)保留父類(lèi)的泛型
// 1)全部保留
class Son3<T1, T2> extends Father<T1, T2> {
}
// 2)部分保留
class Son4<T2> extends Father<Integer, T2> {
}
class Father<T1, T2> {
}
// 子類(lèi)不保留父類(lèi)的泛型
// 1)沒(méi)有類(lèi)型 擦除
class Son<A, B> extends Father{//等價(jià)于class Son extends Father<Object,Object>{
}
// 2)具體類(lèi)型
class Son2<A, B> extends Father<Integer, String> {
}
// 子類(lèi)保留父類(lèi)的泛型
// 1)全部保留
class Son3<T1, T2, A, B> extends Father<T1, T2> {
}
// 2)部分保留
class Son4<T2, A, B> extends Father<Integer, T2> {
}
class Person<T> {
    // 使用T類(lèi)型定義變量
    private T info;

    // 使用T類(lèi)型定義一般方法
    public T getInfo() {
        return info;
    }

    public void setInfo(T info) {
        this.info = info;
    }

    // 使用T類(lèi)型定義構(gòu)造器
    public Person() {
    }

    public Person(T info) {
        this.info = info;
    }
}    

2、泛型方法

方法,也可以被泛型化,不管此時(shí)定義在其中的類(lèi)是不是泛型類(lèi)。在泛型方法中可以定義泛型參數(shù),此時(shí),參數(shù)的類(lèi)型就是傳入數(shù)據(jù)的類(lèi)型。

訪(fǎng)問(wèn)權(quán)限 是否為靜態(tài) <泛型> 返回類(lèi)型 方法名(泛型標(biāo)識(shí) 參數(shù)名稱(chēng),...) 異常{
	//方法體
}
public class Test {
	public <E> E get(int id, E[] arry) {
		E result = null;
		return result;
	}
}

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

如果B是A的一個(gè)子類(lèi)型(子類(lèi)或者子接口),而G是具有泛型聲明的類(lèi)或接口,G<B>并不是G<A>的子類(lèi)型!比如:String是Object的子類(lèi),但是List<String>并不是List<Object>的子類(lèi),不能相互賦值。而反過(guò)來(lái),如下是可以的:

ArrayList<String> arrayList = new ArrayList<>();
List<String> list = arrayList;

在這里插入圖片描述

通配符的使用

1、使用

比如:List<?>Map<?,?>,
List<?>List<String>List<Object>等各種泛型List的父類(lèi)。

讀取List<?>的對(duì)象list中的元素時(shí),永遠(yuǎn)是安全的,因?yàn)椴还躭ist的真實(shí)類(lèi)型是什么,都包含于Object。而不能向其中添加(寫(xiě)入)對(duì)象。除了null,因?yàn)樗撬蓄?lèi)型的成員:

Collection<?> c = new ArrayList<String>();
c.add(new Object()); // 編譯時(shí)錯(cuò)誤
public static void main(String[] args) {
	List<?> list = null;
	list = new ArrayList<String>();
	list = new ArrayList<Double>();
	list.add(3);//編譯不通過(guò),編譯時(shí)錯(cuò)誤
	list.add(null);
	List<String> l1 = new ArrayList<String>();
	List<Integer> l2 = new ArrayList<Integer>();
	l1.add("AABBCC");
	l2.add(9);
	read(l1);
	read(l2);
}
public static void read(List<?> list) {
	for (Object o : list) {
		System.out.println(o);
	}
}

在這里插入圖片描述

2、有限制的通配符

①<?>
允許所有泛型的引用調(diào)用

②通配符指定上限
extends:使用時(shí)指定的類(lèi)型必須是繼承某個(gè)類(lèi),或者實(shí)現(xiàn)某個(gè)接口,即<=。
<? extends Number> (無(wú)窮小 , Number],只允許泛型為Number及Number子類(lèi)的引用調(diào)用。<? extends Comparable>只允許泛型為實(shí)現(xiàn)Comparable接口的實(shí)現(xiàn)類(lèi)的引用調(diào)用。

③通配符指定下限
下限super:使用時(shí)指定的類(lèi)型不能小于操作的類(lèi),即>=。
<? super Number> [Number , 無(wú)窮大),只允許泛型為Number及Number父類(lèi)的引用調(diào)用。

到此這篇關(guān)于Java泛型在集合使用與自定義及繼承上的體現(xiàn)和通配符的使用的文章就介紹到這了,更多相關(guān)Java 泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot利用AOP完成日志統(tǒng)計(jì)的詳細(xì)步驟

    springboot利用AOP完成日志統(tǒng)計(jì)的詳細(xì)步驟

    項(xiàng)目用到了過(guò)濾器,可能有的人會(huì)不理解,之所以用過(guò)濾器是因?yàn)橄胍谌罩居涗沺ost請(qǐng)求的json數(shù)據(jù)。本文重點(diǎn)給大家介紹springboot利用AOP完成日志統(tǒng)計(jì)的詳細(xì)步驟,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Redis內(nèi)存數(shù)據(jù)庫(kù)示例分析

    Redis內(nèi)存數(shù)據(jù)庫(kù)示例分析

    Redis本身的內(nèi)容比較復(fù)雜。如果你上來(lái),你應(yīng)該研究一個(gè)細(xì)節(jié)點(diǎn),比如連接池和數(shù)據(jù)結(jié)構(gòu)。雖然可以直接了解某一點(diǎn)的詳細(xì)來(lái)源內(nèi)容,甚至盡快解決一些意外,但是容易淹沒(méi)在失眠的細(xì)節(jié)中,整體控制不了Redis
    2022-12-12
  • Java8中的 Lambda表達(dá)式教程

    Java8中的 Lambda表達(dá)式教程

    這篇文章主要介紹了 Java8中的 Lambda表達(dá)式教程,需要的朋友可以參考下
    2017-02-02
  • java報(bào)錯(cuò)狀態(tài)碼問(wèn)題

    java報(bào)錯(cuò)狀態(tài)碼問(wèn)題

    這篇文章主要介紹了java報(bào)錯(cuò)狀態(tài)碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringBoot整合BootStrap實(shí)戰(zhàn)

    SpringBoot整合BootStrap實(shí)戰(zhàn)

    這篇文章主要介紹了SpringBoot整合BootStrap實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring使用AOP完成統(tǒng)一結(jié)果封裝實(shí)例demo

    Spring使用AOP完成統(tǒng)一結(jié)果封裝實(shí)例demo

    這篇文章主要介紹了Spring使用AOP完成統(tǒng)一結(jié)果封裝,本文通過(guò)實(shí)現(xiàn)demo給大家詳細(xì)講解,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 如何使用JCTools實(shí)現(xiàn)Java并發(fā)程序

    如何使用JCTools實(shí)現(xiàn)Java并發(fā)程序

    這篇文章主要介紹了如何使用JCTools實(shí)現(xiàn)Java并發(fā)程序,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • SpringBoot靜態(tài)方法調(diào)用Spring容器bean的三種解決方案

    SpringBoot靜態(tài)方法調(diào)用Spring容器bean的三種解決方案

    在SpringBoot中靜態(tài)方法調(diào)用Spring容器bean時(shí)出現(xiàn)的null值問(wèn)題,本文就來(lái)介紹一下SpringBoot靜態(tài)方法調(diào)用Spring容器bean的三種解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • JVM虛擬機(jī)性能監(jiān)控與故障處理工具介紹

    JVM虛擬機(jī)性能監(jiān)控與故障處理工具介紹

    這篇文章主要為大家介紹了JVM虛擬機(jī)性能監(jiān)控與故障處理工具介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • idea中l(wèi)ombok啟用的方法示例

    idea中l(wèi)ombok啟用的方法示例

    這篇文章主要介紹了idea中l(wèi)ombok啟用的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論

舒兰市| 江北区| 南投县| 郯城县| 汾西县| 沾化县| 灵川县| 博兴县| 平度市| 澄江县| 河源市| 汕头市| 孙吴县| 宁远县| 怀远县| 文安县| 盐源县| 沂源县| 彰化市| 汉寿县| 罗源县| 西吉县| 潜江市| 九台市| 陇西县| 肇庆市| 山东| 渭南市| 柘荣县| 托克逊县| 麦盖提县| 望城县| 宁夏| 错那县| 凉城县| 固始县| 马公市| 农安县| 鲁山县| 吴川市| 昌宁县|