[英]Is there a method in Java that mimics the cast of primitive type to Character?
為了簡化一些字節碼分析,我想通過調用盒裝類型的等效方法來替換 Java 程序中原始類型的顯式(向下)轉換。 在大多數情況下,這很簡單:
double d = 42.0;
int i = (int)d;
可以變成
Double tmp = new Double(d);
int i = tmp.intValue();
這適用於所有簽名類型。 但是char
和Character
沒有這樣的方法。 也就是說,Integer、Float 等具有intValue
、 floatValue
等方法,但沒有一個方法charValue
。 是否有 jdk 方法從原始類型到字符/字符?
所以基本上,是否有這樣的事情:
Integer num = new Integer(65);
char ch = num.charValue();
關鍵是不要使用(char)
。
如果您正在修改字節碼,我認為您不需要強制轉換為char
。 在字節碼中, char
類型實際上是作為int
處理的二等公民。 來自JVMS §4.9.2 :
還允許對
int
類型的值進行操作的指令對boolean
、byte
、char
和short
類型的boolean
進行操作。如第 2.3.4 節和第 2.11.1 節所述,Java 虛擬機在內部將
boolean
、byte
、short
和char
類型的boolean
轉換為int
類型。)
因此,雖然您不能在沒有顯式轉換的情況下在 Java 語言中將int
分配給char
,但您可以在字節碼中這樣做,因為它們具有相同的“ 驗證類型”,即int
。 char
的字節碼表示只是一個int
,它的高位兩個字節為零。 所以而不是:
char ch = num.charValue();
你將能夠逃脫(在字節碼中):
int ch = num.intValue() & 0x0000FFFF;
然后假設ch
是一個char
(例如,將它傳遞給需要char
方法或將其存儲在char
字段或數組中)。
但是,如果我理解正確的話,這就是i2c
int
to char
cast 指令已經執行的操作,因此用顯式 AND 操作替換它不會更簡單。
如果您將(有符號)雙精度型轉換為(無符號)字符,則很難找到實際發生的情況。
當您從float
或double
為byte
、 short
或char
,它首先轉換為int
,這會將超出范圍的值飽和為Integer.MAX_VALUE
或Integer.MIN_VALUE
,然后截斷int
的字節以適合最終類型。 參見JLS §5.1.3 – 縮小原始轉換。 截斷步驟意味着將超出范圍的浮點值轉換為byte
、 short
或char
可能不會給出有用的結果。
我認為類中沒有任何直接方法來獲取char
表示。 但是,簡單的解決方案是:
Integer num = new Integer(65);
char ch = (char)num.intValue();
我相信你已經想到了這一點。 但似乎沒有更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.