java學習-list集合有泛型情況新增多種型別資料
//來自一道面試題的分析,大概的意思是,如果讓你在集合中增加不同型別的資料,你會怎麼做?
package cn.cnsy123.ypf.thread.test; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; public class Demo1 { public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ObjectTOIntegrException { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(123); Class<?> clz = list.getClass(); Method method = clz.getMethod("add", Object.class); method.invoke(list, "qwe"); method.invoke(list, "haha"); System.out.println(list); } }
解釋,初始建立一個空的list集合,暫時將泛型定義為Integer整形資料型別,
ArrayList<Integer> list = new ArrayList<Integer>();
在java7的新特性中,可以這麼定義
ArrayList<Integer> list = new ArrayList<>();
並增加幾個符合泛型的資料,比如:
list.add(111);
list.add(222);
list.add(333);
list.add(444);
然後,怎麼解決增加其他資料型別的資料呢?
一般會直接這麼做:
list.add("hello world");
可以這樣會發現編輯器,會給我們這樣的提示
就是說這個方法不能將String型別的資料作為引數增加進List集合中,
那我們怎麼辦呢?
這時,我們可以想一想class檔案中的編碼格式是怎麼樣的
我們會發現在編譯成class檔案時泛型,被javaJVM剔除了,也就是說在編寫java程式碼時有泛型
而在編譯成class檔案時,泛型被去除了,
那麼我們所知道的什麼可以直接在編寫過程中就可以實現這種方式呢?
當然是java反射了,我們可以想想怎麼做呢?
首先,先得到list集合的class物件,也就是獲取ArrayList類的class物件,
Class<?> clz = list.getClass();
當然也可以是這樣的:
Class<ArrayList<Integer>> clz = (Class<ArrayList<Integer>>) list.getClass();
然後再獲取list集合的add方法,
Method method = clz.getMethod("add", Object.class);
這裡有兩個引數,第一個是要獲取的方法的名稱;第二個是要獲取的方法的方法引數型別,
這裡的方法引數型別,我們就可以用來做點文章了,
如果我們只想有Integer型別的資料,那麼就是Integer的class物件,也就是Integer.class;
Method method = clz.getMethod("add", Integer.class);
如果我們只想是其他型別的資料,那麼就是其他型別的class物件;
Method method = clz.getMethod("add", String.class);
Method method = clz.getMethod("add", Boolean.class);
......
......
這裡我們要的是可以增加所有的型別,所以我們將之定義成Object超類的class物件即可;
第三步,使用Method方法的invoke方法去進行賦值,
method.invoke(list, "haha");
method.invoke(list, 'd');
method.invoke(list, true);
method.invoke(list, 1000000L);
.......
第四步,將我們的結果展示出來,也就是上面的三步,已經實現了我們想要的結果,所以
直接使用輸出語句列印到控制檯上即可。
System.out.println(list);
最終結果展示,
謝謝大家的閱覽,有問題請在下方評論區留言,感謝大家的支援。
相關推薦
java學習-list集合有泛型情況新增多種型別資料
//來自一道面試題的分析,大概的意思是,如果讓你在集合中增加不同型別的資料,你會怎麼做?package cn.cnsy123.ypf.thread.test; import java.lang.reflect.InvocationTargetException; impo
Java進階學習之集合與泛型(1)
[TOC](目錄) ## 1.集合 #### 1.1.集合是什麼 之前的基礎篇中我們知道了一種資料結構:陣列,可以存放很多資料。但是資料有很大的侷限性: - 支援的資料型別單一 - 宣告時需要指定大小,大小固定,可擴充套件性差 - 連續的儲存單元,對記憶體要求苛刻 那麼是否有其他的資料結構或者資料型
Head first java chapter 16 集合與泛型(數據結構)
技術分享 rst image 結構 logs ges nbsp alt log Head first java chapter 16 集合與泛型(數據結構)
java week 9----- 集合與泛型
評估 -m 正常 面向對象思想 acm 元素 篩選 -o 內容 1. 本周學習總結 1.1 以你喜歡的方式(思維導圖或其他)歸納總結集合與泛型相關內容。 2. 書面作業 本次作業題集集合 1. List中指定元素的刪除(題集題目) 1.1 實驗總結。並回答:列舉至少2種在
day16(List集合&泛型)
###16.01_集合框架(去除ArrayList中重複字串元素方式)(掌握)* A:案例演示 * 需求:ArrayList去除集合中字串的重複值(字串的內容相同) * 思路:建立新集合方式&n
java基礎08_Collection集合及泛型
主要內容 Collection 集合、 迭代器、 增強 for、 泛型 1. Collection 集合 集合 :集合是java中提供的一種容器,可以用來儲存多個數據。 集合和陣列既然都是容器,區別為: 陣列的長度是固定的。集合的長度是可變的。 陣列中儲存
JAVA基礎之集合、泛型
今天我們來聊聊集合; 通常,我們的程式需要根據程式執行時才知道建立多少個物件。但若非程式執行,程式開發階段,我們根本不知道到底需要多少個數量的物件,甚至不知道它的準確型別。為了滿足這些常規的程式設計需要,我們要求能在任何時候,任何地點建立任意數量的物件,而這些物件用什麼來容納呢?我們首先
list集合裡面泛型是map如何取出值
public class MapDemo02 { public static void main(String[] args) { Map<String,String> map = new HashMap<String,String>(); m
java學習之路 之 泛型及練習題
泛型 為什麼要有泛型(Generic)?1. 解決元素儲存的安全性問題2. 解決獲取資料元素時,需要型別強轉的問題泛型,JDK1.5新加入的,解決資料型別的安全性問題,其主要原理是在類宣告時通過一個標識表示類中某個屬性的型別或者是某個方法的返回值及引數型別。這樣在類宣告或例
JAVA中List陣列與泛型
去除ArrayList中重複字串元素方式 A:案例演示 需求:ArrayList去除集合中字串的重複值(字串的內容相同) 思路:建立新集合方式 /** * A:案例演示 * 需求:ArrayList去除集合中字串的重複值(字串的內容相同) * 思
java集合,泛型簡單總結
容易 對象 並且 集合 需要 api文檔 array object 類型轉換 1.set中裝的對象是沒順序不可以重復。重復的判斷:只要兩個對象equals相等就行了。(要理解的是,並非重復了就報錯,只是存儲時候只有一個,輸出的時候只會輸出一個。) 2.list中的數據對象有
JAVA-初步認識-常用對象API(集合框架-泛型-泛型類)
bject 是我 work 開發 class com 早期 顯示 想要 一. 泛型我們了解完基本原理之後,除了在集合中用來傳遞參數類型外,還有其它的應用。它還能為我們提供很多設計上的便捷。 介紹一下以前和現在的定義方法,有什麽不一樣。 這裏面為了方便於應用,搞了一個工具類,
Java 集合和泛型
ron 接口 關系 ons 增加 pre pos 接口設計 操作 一、集合(Collections) Java使用集合來組織和管理對象。 1、Java的集合類 集合類主要負責保存、盛裝和管理對象,因此集合類也被稱為容器類。 集合類分為Set、List、M
JAVA-初步認識-常用對象API(集合框架-泛型-泛型限定-上限)
產生 中標 我們 同時 高級用法 情況下 探討 不一定 port 一. 泛型的基本使用已經說完了,泛型類,泛型接口和泛型方法的體現也已經講述完了。現在講述一下,泛型的高級使用。 來一個String,定義一個集合,裏面存儲的全都是字符串,那我們就明確類型。明確完之後,就導一
JAVA-初步認識-常用對象API(集合框架-泛型-泛型限定-上限的體現)
但是 查看 ava 接收 可能 自然 隱患 post 定義 一. 現在要說應用,查看一下API中的註釋, 這裏有一個方法addAll裏面有extedns E,我們看一下這個方法什麽時候用。下面這三個集合,有存儲person,student,還有worker的。 再接下
java 物件的成員變數賦值兼任型別, (若有泛型也相容型別)
在學Spring 依賴注入 通過 註解@Autowired 可以自動執行欄位, 方法等. 很好奇那欄位是如何相容型別賦值的, 而且自動泛型注入(判斷) 功能沒有做完, 做的也很籠統, 希望指教。 /*
Java 集合17 泛型限定的練習
獲取集合中的最大元素(承接之前的繼承體系) 思路: 1.定義變數記錄每一次比較後的最大值,初始化為任意一個 2.便利容器 3.在遍歷時將記錄的元素和遍歷到的元素進行比較 4.遍歷結束,都得到最大值 程式碼一:(沒有泛型) package Collection
java:集合框架(泛型高階之萬用字元)
* A:泛型萬用字元<?> * 任意型別,如果沒有明確,那麼就是Object以及任意的Java類了 * B:? extends E * 向下限定,E及其子類 * C:? su
黑馬程式設計師-集合和泛型集合-學習筆記
垃圾回收: 1、CLR的一個核心功能 2、垃圾回收器,的目的:提交記憶體利用率 3、只回收託管堆中的記憶體資源,不回收其他資源(資料庫連線,檔案控制代碼,網路埠等) 4、GC.Collect();//手動垃圾回收(不建議使用) 集合介紹: 延伸(陣列特點:型別統一,長度固
C#泛型入門學習泛型類、泛型集合、泛型方法、泛型約束、泛型委託
本章閱讀列表 泛型很難理解?不然 泛型集合和ArrayList的裝箱拆箱 常見的泛型型別 泛型類和泛型方法 泛型約束 泛型委託 泛型很難理解?不然 在接觸的一個新的概念的時候,總會感覺難以理解,當你掌握並能熟練地使用的時候,發現這個概念其實簡單的,我相信