簡體   English   中英

如何將 java 對象強制轉換為任意其他類型

[英]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.

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