簡體   English   中英

Java 中是否有一種方法可以模擬將原始類型轉換為 Character?

[英]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();

這適用於所有簽名類型。 但是charCharacter沒有這樣的方法。 也就是說,Integer、Float 等具有intValuefloatValue等方法,但沒有一個方法charValue 是否有 jdk 方法從原始類型到字符/字符?

所以基本上,是否有這樣的事情:

Integer num = new Integer(65);
char ch = num.charValue();

關鍵是不要使用(char)

如果您正在修改字節碼,我認為您不需要強制轉換為char 在字節碼中, char類型實際上是作為int處理的二等公民。 來自JVMS §4.9.2

還允許對int類型的值進行操作的指令對booleanbytecharshort類型的boolean進行操作。

如第 2.3.4 節和第 2.11.1 節所述,Java 虛擬機在內部將booleanbyteshortchar類型的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 操作替換它不會更簡單。

如果您將(有符號)雙精度型轉換為(無符號)字符,則很難找到實際發生的情況。

當您從floatdoublebyteshortchar ,它首先轉換為int ,這會將超出范圍的值飽和為Integer.MAX_VALUEInteger.MIN_VALUE ,然后截斷int的字節以適合最終類型。 參見JLS §5.1.3 – 縮小原始轉換 截斷步驟意味着將超出范圍的浮點值轉換為byteshortchar可能不會給出有用的結果。

我認為類中沒有任何直接方法來獲取char表示。 但是,簡單的解決方案是:

Integer num = new Integer(65);
char ch = (char)num.intValue();

我相信你已經想到了這一點。 但似乎沒有更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM