如何在Vala中投射紧凑型?

时间:2015-06-04 07:31:57

标签: casting vala

我正在使用Vala的gobject-introspection-1.0库来动态加载gir模块。因为我需要调用具有固定名称的初始化函数,所以我从Repository.find_by_name中检索BaseInfo对象。

现在,我想用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;

第一个导致编译错误:

  

错误:此类型不支持此操作

运行时断言中的第二个失败,myCallableInfo为null:

  

g_boxed_copy:断言'G_TYPE_IS_BOXED(boxed_type)'失败

最后一个给出了一个编译错误,它引导我进入紧凑型路径:

  

紧凑类,结构和枚举不支持类型检查表达式

如何成功将GI.BaseInfo转换为GI.CallableInfo?

1 个答案:

答案 0 :(得分:4)

当您分配给拥有的变量时,Vala必须复制该值(在这种情况下,类型不是引用计数,因此复制是唯一的方法)。这里的问题是复制,而不是铸造。将其分配给无主变量:

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