詳解 泛型 與 自動拆裝箱

来源:https://www.cnblogs.com/codderYouzg/archive/2020/02/29/12385906.html
-Advertisement-
Play Games

[toc] 泛型: 首先,本人來介紹一下 什麼是泛型 : 泛型概述 : 是一種把類型明確的工作 推遲到創建對象 或者 調用方法的時候 才去 明確的特殊的類型 。 參數化類型 ,把類型當作參數一樣的傳遞。 通俗一點來講:泛型 是JAVA 中一種十分強大的機制,因為它能夠完成在 未知元素類型 的情況下對 ...


目錄



泛型:

首先,本人來介紹一下什麼是泛型

泛型概述:
是一種把類型明確的工作 推遲到創建對象
或者 調用方法的時候才去 明確的特殊的類型
參數化類型,把類型當作參數一樣的傳遞。

通俗一點來講:泛型 是JAVA 中一種十分強大的機制,因為它能夠完成在未知元素類型的情況下對元素進行操作。
但是,泛型只在編譯階段有效,即在編譯過程中,程式會正確的檢驗泛型結果。而編譯成功後,*.class 文件是不包含任何泛型信息的(這就是JVM 的泛型擦除機制)
並且,泛型類只能在子類或者父類被調用。

那麼,本人再來講解一下使用泛型的好處

泛型的好處
(1): 把運行時期的問題提前到了編譯期間
(2): 避免了強制類型轉換
(3):優化了程式設計,解決了黃色警告線
------------------------------------------------------------
註意:泛型只在編譯期有效 但在運行期就擦除
(至於泛型擦除機制,本人將在後續的博文中提到,並且對於這個機制,本人也提出了相應的解決方法,希望同學們對此加以註意!!!)

現在,本人來講解一下有關 泛型的基本格式

泛型類 -------- 許可權修飾符(public...) class 類名<泛型類型1,…>
泛型方法 ----- 許可權修飾符(public...) <泛型類型> 返回類型 方法名(泛型類型 變數名)
泛型變數 ----- 許可權修飾符(public...) 泛型類型 變數名
泛型介面 ----- public interface 介面名<泛型類型>

此外,本人要講解一個關於泛型,極為重要的一個知識點——通配符

A:泛型通配符<?> ------ 任意類型,如果沒有明確,那麼就是Object以及任意的Java類了
B:? extends E ---------- 向下限定,E及其子類
C:? super E ------------ 向上限定,E及其父類

那麼,本人在這裡來通過一個例子來展示一下有關 泛型的通配符的基本用法:
現在,本人用本人《詳解 繼承(上)—— 工具的抽象與分層》中所創建的Grandfather類,Parent類 和 Child類來展示下通配符的 正確用法:

package com.youzg.study;

import java.util.ArrayList;

public class AboutGeneric1 {
    public static void main(String[] args) {
        ArrayList<Parent> people = new ArrayList<Parent>();
        ArrayList<Child> people2 = new ArrayList<Child>();
        
        //? 泛型統配符
        ArrayList<?> people3 = new ArrayList<Child>();
        ArrayList<?> people4 = new ArrayList<Parent>();

        //向上限定
        ArrayList<? super Parent> people5 = new ArrayList<Parent>();
        ArrayList<? super Parent> people6 = new ArrayList<Grandfather>();
       // ArrayList<? super Parent> people7 = new ArrayList<Child>(); 報錯

        //向下限定
        ArrayList<? extends Parent> people8 = new ArrayList<Parent>();
        ArrayList<? extends Parent> people9 = new ArrayList<Child>();
       // ArrayList<? extends Parent> people1 = new ArrayList<Grandfather>(); 報錯
    }
}

本人再來舉一個例子,因為在之前的博文中已經講到過“數組”的知識了,所以我們加入要對未知類型的數組進行“逆序”操作,那麼,代碼如下:

package com.mec.study;

public class AboutGeneric {

    public static <T>T[] revArray(T[] m) {
        T temp;
        
        for(int i=0; i<m.length/2; i++) {
            temp = m[i];
            m[i] = m[m.length-i-1];
            m[m.length-i-1] = temp;
        }
        
        return m;
    }
    
}

現在,本人對上述代碼進行一下解釋:
在方法 返回值類型(即T[]) 前出現的,說明這個方法用到泛型;在以後的代碼中,T就代表某種類類型
而這種類類型的具體情況,要等到方法被調用時,再根據實參具體類型進行判定。
這裡要特別提醒的一點是:泛型只能是類類型

利用泛型,我們也可以來定義泛型類,代碼如下:

package com.mec.study;

public class MyGeneric<T> {
    private T member;
    
    public MyGeneric() {
        
    }
    
    public MyGeneric(T member) {
        this.member = member;
    }
    
    public T getNumber() {
        return member;
    }
    
}

那麼,我們將泛型定義下來,如何去使用呢?
下麵,本人通過一段代碼,來展示下 定義好的泛型 的用法:

package com.mec.study;

public class DemoGeneric {

    public static void main(String[] args) {
        System.out.println(new MyGeneric<Integer> (1024).getNumber()); 
    }

}

展示下運行結果:
在這裡插入圖片描述
對於上述代碼,可能有同學會有疑問,什麼是Interger?


我們接下來介紹下這篇博文的第二個主題——自動拆裝箱

自動拆裝箱:

在第一篇博文中,本人就提到過,Java中存在八大基本類型,分別是:

byte、char、short、int、long、float、double、boolean

那麼,與之相對應的,Java也提供了8種類類型:

Byte、Character、Short、Integer、Long、Float、Double、Boolean

現在的Java,增加了“自動拆箱自動裝箱”功能。
而所謂的“自動拆箱 和 自動裝箱”,
就是例如:
在需要時,JVM自動將 int類型的變數 轉換為 Integer的對象,反之亦然。


講到這裡,這篇博文的全部內容就講解完成了。
若是對上述知識點或代碼有任何疑惑、意見或者建議,請在下方評論區提出,本人將儘早予以答覆,覺得有所幫助的同學請留下小贊贊,謝謝!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有監督學習 常用分類演算法 KNN:K近鄰分類器。通過計算待分類數據點,與已知數據中所有點的距離,取距離最小的前K個點,根據"少數服從多數"的原則,將這個數據點劃分為出現次數最多的那個類別。 在sklearn中,使用sklearn.neighbors.KNeighborsClassifier創建K鄰近 ...
  • 1、格式 符號為大括弧 集合沒有順序,也不支持下標操作 集合沒有重覆的數據 2、定義的類型 #有數據 s1 = {1, 3, 4} # {1,3,4} s2 = set('asdadsdas') # {'a','s','d'} 集合沒有重覆數據,也沒有順序 # 空集合 s3 = {} # dict ...
  • 1、格式 符號為大括弧 數據為鍵值對形式出現(字典數據與數據順序沒有關係,即字典不支持下標) 各個鍵值對之間逗號隔開 2、定義的類型 # 有數據 dict1 = {'name': '小明', 'sex': '男'} # 空字典 dict2 = {} dict3 =dict() # 函數定義 3、常用 ...
  • Spring Cloud官網: 本篇主要講 "Spring Cloud Config" ,參考內容如下: "Spring Cloud Config 2.2.1.RELEASE參考文檔" "Spring Cloud Config 實現配置中心,看這一篇就夠了" 實現簡單的配置中心 配置文件就在Spri ...
  • 接上篇博文—— "《詳解 繼承(上)—— 工具的抽象與分層》" 廢話不多說,進入正題: 本人在上篇“故弄玄虛”,用super();解決了問題,這是為什麼呢? 答曰:子類中所有的構造方法 預設 都會訪問父類中 空參數的構造方法 (拓展:由於這個原理,我們今後所做的“ 工具類 ”都必須要帶上無參構造) ...
  • 本篇博文講解的知識點比較實用,但是,相關知識點太多,所以本人將內容分為上下兩冊, 那麼,本人就不多廢話,直接進入主題進行講解了! 說到“繼承”,大家可能都會想到我們日常中對於這個詞的定義:將先人的 物品 或 意志 傳承給後人,而後人也可以“擇優繼承”,併在先人的基礎上產生 新的物品 或 新的意志。 ...
  • 1、格式 (數據1,數據2,數據3,...) 定義元組使用小括弧,且逗號隔開各個數據,數據可以是不同的數據類型。 元組和列表的區別:元組存儲的數據不能修改 2、定義的類型 單數據元組和多數據元組 t1 = (1, 2) print(type(t1)) # tuple 多數據元組 t2 = (1,) ...
  • Title:ElasticSearch實戰系列四: ElasticSearch的聚合查詢基礎使用教程之度量(Metric)聚合 前言 在上上一篇中介紹了 "ElasticSearch實戰系列三: ElasticSearch的JAVA API使用教程" ,介紹了ElasticSearch Java A ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...