在作一個類型轉換時遇到了下面的異常:java
是說不能把 Integer 類型強制轉換成 String 類型。git
個人測試代碼大概是這個樣子:github
public static void testClassCastException() { Integer i1 = Integer.valueOf(getT()); // ① 拋異常 Integer i2 = (Integer) getT(); // ② 正常 Integer i3 = Integer.valueOf(getT().toString()); // ③ 正常 } private static <T> T getT() { return (T) new Integer(10); } // ①和③的不一樣在於Integer.valueOf()裏的參數的類型,其實Integer.valueOf()方法就是須要String類型的,因此咱們直接用Integer類型固然在底層是不識別的。 // ①和②的不一樣在於類型轉換的方式,這個就引伸出下面這個問題了。 複製代碼
在 API 中 toString()被描述爲:spring
返回該對象的字符串表示。一般,toString 方法會返回一個「以文本方式表示」此對象的字符串。結果應是一個簡明但易於讀懂的信息表達式。建議全部子類都重寫此方法。安全
Object 類的 toString 方法返回一個字符串,該字符串由類名(對象是該類的一個實例)、標記符「@」和此對象哈希碼的無符號十六進制表示組成。換句話說,該方法返回一個字符串,它的值等於:getClass().getName()+'@'+Integer.toHexString(hashCode()) 咱們在定義一個類的時候能夠重寫繼承自 Object 的 toString()方法,以此來表示該對象的基本信息。 可是,使用 toString()的對象不能爲 null,不然會拋出異常 java.lang.NullPointerException。markdown
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); } 複製代碼
值得注意的是,若是使用對象爲 null,返回的結果是字符串」null」,而不是對象 null。 在不少時候使用 String.valueOf()比使用 toString()更能減小報錯的機會,由於不用考慮是否爲 null 的狀況。可是,也要特別注意:if(String.valueOf(o) == null){...}這樣的代碼確定就回有問題,由於永遠不會獲得執行。oop
Integer o = new Integer(100); System.out.println((String)o); 複製代碼
如上代碼編譯時就會報錯:Cannot cast Integer to String,說明 Integer 不能經過強制轉換成 String。 而咱們一開始的代碼:測試
Object x = new Integer(0); System.out.println((String)x); 複製代碼
在編譯時沒錯,運行時拋出異常。這是由於 x 在表面上是 Object,其實是 Integer。而 Object 是能夠經過強制轉換成爲 String 的。因此,在編譯的時候,x 被當成了 Object,你們相安無事,真正運行的時候,x 被查出來是 Integer,理所固然就拋出了 ClassCastException。spa
取到的對象進行類型轉換若是不知道具體會是什麼類型的,能夠經過instanceof
關鍵字來檢查改對象屬於哪一個類型的,再具體去進行某些業務。.net
「PS:」
a instanceof b
的結果和b.class.isInstance(a)
的結果是一致的,能夠實現相同的功能,徹底等價。
由於 String
和 Integer
不是在同一個對象階層。
Object
/ \
/ \
String Integer
複製代碼
當你嘗試強制轉換時,僅僅會在同一個對象階層轉換。好比:
Object
/
/
A
/
/
B
複製代碼
在這種狀況,(A)objB
或者 (Object)objB
或者 (Object)objA
能夠進行轉換。
正如其餘人已經提到,將integer
轉換成String
可使用如下方法:
基本類型的整型時使用:String.valueOf(integer)
或者Integer.toString(integer)
來轉換成String
。 Integer
對象型時使用:Integer.toString()
轉換成String
參考:
翻譯|爲何在 Java 裏不能將 Integer 強制轉換成 String | PostgreSQL DBA
java.toString() ,(String),String.valueOf 的區別 _java_springk 的專欄-CSDN 博客
本文使用 mdnice 排版