淺談泛型數組

来源:https://www.cnblogs.com/MrJR/archive/2019/03/02/10463479.html
-Advertisement-
Play Games

我的其他隨筆: 來一局緊張刺激的吃雞——淺談裝飾者模式 一起去開心的購物吧——淺談觀察者模式 記一場精彩的籃球比賽——淺談策略模式 大家好,前幾日連夜更了幾篇Java設計模式的小隨筆,從觀看量來說,我還是很高興的,有很多的朋友通過看了博文,也許接觸了新的知識,也許理解了自己之前沒弄懂的東西,也許只是 ...


聲明:本文為原創,如有轉載請註明轉載與原作者並提供原文鏈接,僅為學習交流,本人才識短淺,如有錯誤,敬請指正

我的其他隨筆:

來一局緊張刺激的吃雞——淺談裝飾者模式

一起去開心的購物吧——淺談觀察者模式

記一場精彩的籃球比賽——淺談策略模式

大家好,前幾日連夜更了幾篇Java設計模式的小隨筆,從觀看量來說,我還是很高興的,有很多的朋友通過看了博文,也許接觸了新的知識,也許理解了自己之前沒弄懂的東西,也許只是加深了自己的相關方面的印象,反正不管怎麼說,如果我淺薄的小隨筆能在大家廣闊的腦海中留下一絲絲漣漪,我都甚感榮幸。

恰逢周末,我也就不打算再更一篇重量級的設計模式相關的文章,人嘛,還是要休息的,接下來準備寫得是比較繁雜的工廠模式和抽象工廠模式,敬請大家期待,如果想看之前的我的陋作的話,可以點擊上面的鏈接。

今天呢,就簡單的講一下Java裡面的泛型數組的一些小知識,屬於本人的一點小總結,如果有錯誤的,請大家多多指正,共同進步。

 

在Java中,我們不能實例化(註意我說的是實例化)一個參數化類型的數組,但是卻可以參數化數組本身的類型,也許大家覺得有點繞口,沒有關係,我來慢慢解釋,並且通過代碼,讓大家看的更清楚。

第一種情況,不能實例化一個參數化類型的數組,什麼叫參數化類型的數組呢,就是這個數組裡存儲的對象是參數化類型,大家比較熟悉的List<String>就是一個類型參數為String的參數化類型,我們在Java中也稱呼它為泛型。來看代碼(直接粘貼的代碼沒有編譯器的報錯指示,所以我直接截圖):

我們發現報錯了,報錯信息就是Java無法創建參數化類型的數組。

那麼為什麼Java會禁止我們做這樣的事呢,《Thinking in java》一書中指出,由於泛型具有擦除機制,在運行時的類型參數會被擦除,Java只知道存儲的對象是一個Object而已,而對於Java的數組來說,他必須知道它持有的所有對象的具體類型,而泛型的這種運行時擦除機制違反了數組安全檢查的原則。

那麼有其他可以曲線救國的方法嗎,註意我之前所說,雖然我們不能實例化一個參數化類型的數組,但是編譯器也只是檢查實例化而已,而對於創建一個參數化類型數組的引用,卻並不會報錯。

所以我們可以通過創建一個非參數化類型的數組,然後將他強制類型轉換為一個參數化類型數組。即:

然後我們就會發現編譯不再提示報錯,我們來使用一下看看。

正常傳入一個String類型參數的list並不會有任何問題,但當我們傳入一個類型參數為Integer的list時編譯器卻提示我們有錯,報錯原因是類型不合法,數組期望一個List<String>,我們卻傳入了List<Integer>,由此我們知道,通過強轉型實現的參數化類型數組,Java已經獲悉了這個數組在運行時應該持有的具體類型,因此他是一個合法的數組。

這是第一種情況,我們不能實例化參數化類型的數組。

第二種情況,我們可以參數化數組本身的類型。

參數化數組本身的類型,顧名思義,我們不再參數化數組持有的對象的類型,而是將數組應該存儲的對象進行參數化,我們來看一個返回一個數組的參數化方法:

在該參數化方法中,我們傳入了一個數組,返回該數組本身,唯一的引人註目的地方就是數組中的對象類型為泛型。

我們來簡單的測試一下。

其中JR類為我建的一個簡單類,重寫了toString方法便於查看,而不是讓他預設列印對象地址。

下麵是運行結果。

我們發現,無論我們傳入Integer類型數組或String類型數組或自定義對象數組,該參數化方法總能正確的執行,即數組本身的類型被參數化了,但在運行時,被賦予了具體的類型。

事實上,即使我們能參數化數組本身的類型,我們也不能直接創建一個泛型數組,這在編譯時都不被允許。

註意紅色波浪線。

我們可以通過創建Object數組然後將其強轉型為T[ ]來近似實現我們的目的,但這是沒有意義的。

因為在這種情況下,任何Object類型及其子類,也就是除了基本類型之外的所有Java對象都可以放入這個數組中。

通過以上的研究,我們可以發現,想將泛型與數組聯繫起來使用是一件既危險又容易自討沒趣的苦差事,所以在日常使用中,我們最普遍使用泛型的情況就是與Collection與Map聯繫使用,以協助我們快速發現錯誤而不是等到運行時才報出一大串異常。

謝謝大家,今天的泛型數組的相關內容大致就說到這裡了,有問題的話大家可以在下麵評論區交流哦。

 


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

-Advertisement-
Play Games
更多相關文章
  • 從生成器到協程 協程是指一個過程,這個過程與調用方協作,產出由調用方提供的值。生成器的調用方可以使用 .send(...)方法發送數據,發送的數據會成為yield表達式的值。因此,生成器可以作為協程使用。 從句法上看,生成器與協程都是包含yield關鍵字的函數。但是,在協程中,yield通常出現在表 ...
  • 對於程式員來說安全防禦,無非從兩個方面考慮,要麼前端要麼後臺。 一、首先從前端考慮過濾一些非法字元。 前端的主控js中,在<textarea> 輸入框標簽中,找到點擊發送按鈕後,追加到聊天panel前 進行過濾Input輸入內容 二、在後臺API服務解決反射型XSS漏洞 thinking:一般來說前 ...
  • 一般的程式員或許只需知道一些JAVA的語法結構,能對資料庫數據進行CRUD就可以應付了。但要成為JAVA(高級) 工程師,就要對JAVA做比較深入的研究,需要不斷學習進步,以下對高級工程師需要突破的知識點做個簡要整理 ...
  • 1、 "官網" 下載 選擇一個速度快的鏡像 推薦東軟這個 2、雙擊下載的安裝包,下一步 其中有一步是選擇Eclipse版本,SE選第一個,EE第二個。仔細審題吧。 3、配置JDK 應用、關閉 4、測試:寫個Hello World運行 1)New Project 寫個工程名 finish 2)在src ...
  • 當都為正數時,即1+2+3+...+99,如上,很簡單; 其實,計算正負相間的式子也很簡單,只需要加上一個標記正負號的變數乘到計數器上即可。 用一個布爾型變數來記錄執行加法還是減法,也能達到同樣的效果(這裡額外增加一個要求,就是剔除某個數後,保持正負相間的累加) 這樣,得到的就是1-2+3-4... ...
  • 今日不寫日感,直接扔上今日興趣點: 新研究稱火星曾經有一個巨大的地下水系統 鏈接:https://mbd.baidu.com/newspage/data/landingsuper?context=%7B"nid"%3A"news_6959868648919860397"%7D&n_type=0&p_ ...
  • 1、下載JDK "官網" 打開後,直接下載最新版本。 選擇dmg文件下載 2、開始安裝,一直下一步。 3、打開終端,查詢安裝路徑: ,複製備用。 4、配置Java的環境變數 1)打開終端,到主目錄 2)查看是否有.bash_profile文件 3)如果沒有新建一個 4)有了這個文件以後,進行編輯 , ...
  • 基於Python結合pykafka實現kafka生產及消費速率&主題分區偏移實時監控 By: 授客 QQ:1033553122 1.測試環境 python 3.4 zookeeper-3.4.13.tar.gz 下載地址1: http://zookeeper.apache.org/releases. ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...