2015-06-04 123 views
1

我使用Vala的gobject-introspection-1.0庫來動態加載吉爾模塊。因爲我需要調用具有固定名稱的初始化函數,所以我從Repository.find_by_name中檢索BaseInfo對象。如何在Vala中使用緊湊型?

現在,我想調用GI.CallableInfo.invoke這個函數,它需要一個GI.CallableInfo對象。

幸運的是,GI.CallableInfo繼承自GI.BaseInfo,我檢索的實例可能是GI.CallableInfo。因此,我試圖以動態或靜態地將它轉換:

GI.CallableInfo myCallableInfo = myBaseInfo as GI.CallableInfo; 

GI.CallableInfo myCallableInfo = (GI.CallableInfo) myBaseInfo; 

GI.CallableInfo myCallableInfo = (myBaseInfo is GI.CallableInfo) 
    ? (GI.CallableInfo) myBaseInfo : null; 

第一個結果編譯錯誤:

error: Operation not supported for this type

第二個在運行時斷言失敗,myCallableInfo被空:

g_boxed_copy: assertion 'G_TYPE_IS_BOXED (boxed_type)' failed

最後一個給出了一個編譯錯誤,這導致了我的小型路徑:

type check expressions not supported for compact classes, structs, and enums

如何成功將GI.BaseInfo轉換爲GI.CallableInfo?

回答

3

當你分配給一個擁有的變量Vala必須複製值(在這種情況下,類型不是引用計數,所以複製是唯一的方法)。這裏的問題是複製,而不是鑄造。將其分配給無主變量:

unowned GI.CallableInfo myCallableInfo = (GI.CallableInfo) myBaseInfo;