「如何在Integer類型的ArrayList中同時添加String、Character、Boolean等類型的數據?」javascript
你是否是想到下面的代碼?java
package com.cya.test; import java.util.ArrayList; import java.util.List; public class Test{ public static void main(String []args){ List<Integer> list=new ArrayList<>(); Integer in=1; Character ch='c'; Boolean bo=true; list.add(in); list.add(ch); list.add(bo); System.out.println(list); } }
有點Java基礎的人都知道上面的代碼運行會報錯,若是使用Eclipse等開發工具的話在沒運行以前就會提示有錯了,以下圖:程序員
強制運行一波,看下錯誤提示:web
Exception in thread "main" java.lang.Error: Unresolved compilation problems: The method add(Integer) in the type List<Integer> is not applicable for the arguments (Character) The method add(Integer) in the type List<Integer> is not applicable for the arguments (Boolean) at com.cya.test.Test.main(Test.java:15)
據說英語差的都去當程序員了!!面試
不過不要緊,能get到大致意思就行了,上面的錯誤大致意思以下:算法
程序在編譯時遇到了沒法解析的錯誤,
add方法的參數是Integer類型,沒法接收Character類型的參數,
add方法的參數是Integer類型,沒法接收Boolean類型的參數編程
上面代碼錯誤的緣由是程序沒法經過編譯,在編譯期出現異常,這和Java是編譯性語言(如:C、C++、Delphi、Pascal、Java)有關。與解釋性語言(如:Basic、javascript、Python)不一樣,Java先將後綴名爲.java的源代碼文件編譯成後綴名爲.class的字節碼文件,編譯期間會進行詞法、語法、數據類型、語義分析。上面的錯誤就是在編譯期間進行數據類型分析時類型不匹配形成的。數組
談到這裏,咱們不得不提下Java的異常體系,異常體系結構圖以下:服務器
程序在運行過程當中發生因爲硬件設備問題、軟件設計錯誤等致使的程序異常事件。(在Java等面向對象的編程語言中)異常自己是一個對象,產生異常就是產生了一個異常對象。網絡
如上面的Java異常體系結構圖所示,Throwable有兩個重要的子類:Exception(異常)和Error(錯誤),二者都包含了大量的異常處理類。
(一)Error(錯誤)
程序中沒法處理的錯誤,表示運行應用程序中出現了嚴重的錯誤。此類錯誤通常表示代碼運行時JVM出現問題。一般有Virtual MachineError(虛擬機運行錯誤)、NoClassDefFoundError(類定義錯誤)等。好比說當JVM耗完可用內存時,將出現OutOfMemoryError。此類錯誤發生時,JVM將終止線程。
這些錯誤是不可查的,非代碼性錯誤。所以,當此類錯誤發生時,應用不該該去處理此類錯誤。
(二)Exception(異常)
程序自己能夠捕獲而且能夠處理的異常。
Exception這種異常又分爲兩類:運行時異常和編譯異常。
運行時異常(不受檢異常):RuntimeException類及其子類表示JVM在運行期間可能出現的錯誤。好比說試圖使用空值對象的引用(NullPointerException)、數組下標越界(ArrayIndexOutBoundException)。此類異常屬於不可查異常,通常是由程序邏輯錯誤引發的,在程序中能夠選擇捕獲處理,也能夠不處理。
看完了Java的異常體系,咱們知道上面代碼出現的異常爲編譯時異常,是必需要處理的,不然沒法經過編譯階段,更不要談運行了。
既然上面代碼不可用,那就請出本期的主角---Java的反射機制。
JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲Java語言的反射機制。
在運行時判斷任意一個對象所屬的類;
在運行時構造任意一個類的對象;
在運行時判斷任意一個類所具備的成員變量和方法;
在運行時調用任意一個對象的方法;
方法名稱 | 返回值 | 參數 | 說明 |
---|---|---|---|
getMethods() | Method [] | 無 | 獲取包括自身和繼承過來的全部的public方法 |
getDeclaredMethods() | Method [] | 無 | 獲取自身類中全部的方法(不包括繼承的,和訪問權限無關) |
getMethod(String methodName,Class<?>... parameterTypes) | Method | methodName:表示被獲取方法的名字parameterTypes:表示被獲取方法的參數的Class類型,如String.class | 表示獲取指定的一個公共的方法(包括繼承的) |
getDeclaredMethod(String methodName,Class<?>... parameterTypes) | Method | methodName:表示被獲取方法的名字parameterTypes:表示被獲取方法的參數的Class類型,如 String.class | 表示獲取指定的一個本類中的方法(不包括繼承的) |
java中,除了使用new關鍵字建立對象外,也能夠用newInstance()方法建立對象,例如:
Class class1 = Class.forName("java.util.ArrayList"); List list=(List)class1.newInstance();
public Object invoke(Object obj,Object args[])
做用:動態調用Method類表明的方法
obj:從中調用底層方法的對象,必須是實例化的對象
args:用於方法調用的參數,是個Object數組,由於參數有可能有多個
obj能夠爲空,但必填null,表示同類中的公用方法
args參數能夠爲空,就是對應方法沒有參數
有關Java反射的詳細內容我將會專門出一期來說解,這裏只對本期用到的幾個重要的知識點作概述。
看完了上面的內容,你是否是對面試官的問題有解答思路了呢?下面給出小編本身的想法,若是你有更好的方法,記得跟你們分享哦。
一、建立Integer類型的List集合,用於存放數據。
二、使用對象名.getClass()方法獲取Class對象。
三、調用getMethod()方法獲取指定的Method。
四、調用invoke()方法將不一樣數據類型的數據添加到list集合中。
package com.cya.test; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class Test{ public static void main(String []args) throws Exception{ List<Integer> list=new ArrayList<>(); Object o; //向list中添加Integer類型的數據 Integer integer=1; o=integer; Test.addObjectToList(list, o); //向list中添加String類型的數據 String string="Hello World"; o=string; Test.addObjectToList(list, o); //向list中添加Character類型的數據 Character character='c'; o=character; Test.addObjectToList(list, o); //向list中添加Boolean類型的數據 Boolean boolean1=true; o=boolean1; Test.addObjectToList(list, o); System.out.println(list); } public static List<Integer> addObjectToList(List<Integer> list, Object o) throws Exception{ Class class1=list.getClass(); Method method=class1.getMethod("add", Object.class); method.invoke(list, o); return list; } }
瞭解更多資源請關注我的公衆號:C you again,你將收穫如下資源
一、基於web的機票預訂系統,基於web的圖書管理系統
二、貪吃蛇小遊戲源碼
三、各種IT技術分享
推薦一:計算機網絡中這些高頻考題,你還在死記硬背嗎?(一),講述內容:IP地址及其分類,子網掩碼的概念,網絡號、主機號、直接廣播地址計算方法等。
推薦二:計算機網絡中這些高頻考題,你還在死記硬背嗎?(二),講述內容:局域網接口配置、路由器的靜態路由配置、OSPF動態路由協議配置和DHCP服務器配置。
推薦三:用x種方式求第n項斐波那契數,99%的人只會第一種,講述內容:七種方式求解第N項斐波那契數。
以上就是本期的全部內容了,是否對你有幫助呢?瞭解更多算法請關注公衆號「C you again」。
做者: C you again,從事軟件開發 努力在IT搬磚路上的技術小白
公衆號: 【C you again】,分享計算機類畢業設計源碼、IT技術文章、遊戲源碼、網頁模板、程序人生等等。公衆號回覆 【粉絲】進博主技術羣,與大佬交流,領取乾貨學習資料
關於轉載:歡迎轉載博主文章,轉載時代表出處
求贊環節:創做不易,記得點贊+評論+轉發 謝謝你一路支持