[英]How to cast a java Object to an arbitrary other type
我們正在嘗試在應用程序和服務之間建立一個安全的 IPC 通道。 為此,我們提供了一個encrypt()
和一個decrypt()
函數,用於通信通道的兩端。 encrypt()
函數接受一個任意 Java 對象,使用json-io
將其轉換為字節數組,該數組被加密並通過 base 64 編碼轉換為String
。 decrypt()
函數應該做相反的事情 - 取 b64 String
,將其轉換為解密的字節,然后通過json-io
運行回來以恢復原始對象。
這可能按預期工作,除了decrypt()
函數返回一個Object
,因為我們不知道傳遞給encrypt()
函數的是什么類型的對象。 我們的期望是我們能夠將結果Object
轉換為正確的類型並將其返回給客戶端代碼。 但是,該程序失敗並顯示
java.lang.ClassCastException: java.lang.Object cannot be cast to ...
錯誤。
有沒有辦法在 Java 中解決這個問題? 我發現的所有閱讀材料似乎都表明沒有,但我不知道這是否僅僅是因為我不知道該問正確的問題,還是 Java 不會這樣做。 (我和我的合作者都來自 C++ 背景,這種事情是微不足道的。)
我想到的一個可能的解決方案是為decrypt()
函數使用不同的返回類型,它可以轉換為任意類型,但如果有這樣的野獸,我會感到驚訝。
另一個想法是為每種類型的返回對象實現一個單獨的decrypt()
函數,但這似乎是一種混亂的方法,而且隨着更多類型的添加,這種方法會變得越來越笨拙。
我應該問一個不同的問題嗎?
例如,您可以將聲明為對象的事物轉換為它實際存在的任何類或接口
Object o = java.util.Calendar.getInstance().getTime().toString();
// o is declared as an object but is really a String
// this is fine
String s1 = (String) o;
// this is also fine because String implements CharSequence
CharSequence cs = (CharSequence) o;
同樣,當一個方法返回Object 的某些特定子類時,可以聲明它返回 Object,然后可以將返回轉換為正在返回的特定事物。
然而,如果一個東西被構建為一個對象,它就不能被轉換為任何東西; 它可能是一個類似於 String 的 Object ,但它不是 String 類的對象。
public Object getThing(final Object arg) {
return new Object() {
private String str = arg.toString();
public String getStr() {
return this.str;
}
};
}
這里返回的東西是一個對象(is-a),盡管它擴展了一些無法訪問的位(除了通過反射),因為它們不是 java.lang.Object 合同的一部分。
解決這種問題的一種方法是 Java 泛型。 如果你有public Object decrypt(...)
你可能能夠創建public T decrypt(...)
- 但是你必須實際構建類或接口T
對象,而泛型完全是另一個主題,太大而無法進入這里。
因此,這取決於您的decryptObject(...)
方法實際構建和返回的內容,以了解如何轉換返回的對象。
要進行靜態轉換為(SomeClass) o
您必須已經知道這是什么東西。
我發布這個答案是為了用我的發現結束循環。
原來,問題不在於decrypt()
函數返回了一個Object
不能被轉換為正確的類型:真正的問題是測試代碼喂食普通Object
進入encrypt()
函數-那Object
是無法轉換為ListCertificatesOutputClass
。 一旦我設置了可在線路兩端使用的ListCertificatesOutputClass
的外部定義, ListCertificatesOutputClass
其傳遞給encrypt()
,則轉換輸出decrypt()
按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.