2011-12-04 84 views
0

我正在寫數據到一個新的ByteArray並存入LocalStore爲什麼此ByteArray實驗崩潰AIR

var ba:ByteArray = new ByteArray; 
ba.writeObject(theobject); 

EncryptedLocalStore.setItem(MY_VAL_STORE, ba); //bytes in local store 

作爲一個實驗,我試圖把第一個2線成單行線,所以我正在使用這種語法(我基本上把新的ByteArray放在括號內,並立即使用它)。

var ba:ByteArray = (new ByteArray).writeObject(theobject) as ByteArray; 

EncryptedLocalStore.setItem(MY_VAL_STORE, ba); //bytes in local store 

但是這使我的AIR應用程序在運行時崩潰。如果我回到2線,它工作正常。我意識到這不是什麼大不了的事,但我很好奇爲什麼這個創意語法不起作用。有任何想法嗎?

note:在單行版本中,如果我不添加as ByteArray,它會抱怨我試圖使用void和ByteArray類型。

回答

8

你自己回答了你的問題:

它抱怨說,我試圖使用類型爲void用的ByteArray。

在你的宣言,你的writeObject()結果分配給您的ByteArray變量,而不是通過new ByteArray()創建的實例。由於結果類型爲void,因此此分配是非法的並導致編譯器發出錯誤。然後,您已將void的手動轉換添加到ByteArray,這明顯足以欺騙編譯器,但不會阻止運行時的類型轉換錯誤。

簡而言之:只有在新實例上調用的方法返回this時,此類型的賦值纔有效。一種有用的方式可以使代碼更具可讀性,順便說一句,也被稱爲Method Chaining的概念。

+0

感謝您的解釋。所以我猜我運氣不好,因爲'writeObject()'不會返回這個'' – sameold

+0

確切地說。當然,您可以擴展ByteArray並創建自己的'fromObject(obj:Object)'包裝方法('writeObject(obj);'和'return this;')。但除非你更頻繁地使用它,否則這不會是更少的代碼行。 ;) – weltraumpirat

1

看的writeObject呼叫我猜你的代碼是不工作,因爲該方法的返回值是void的文件,並嘗試將其轉換爲ByteArray

+0

我試過了代碼,它沒有工作,所以我刪除它=) – Cyclonecode