如何在 Vala 中铸造紧凑型?
How to cast a compact type in 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;
第一个导致编译错误:
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?
当您分配给拥有的变量时,Vala 必须复制该值(在这种情况下,类型不会被引用计数,因此复制是唯一的方法)。这里的问题是复制,而不是转换。将其分配给一个无主变量:
unowned GI.CallableInfo myCallableInfo = (GI.CallableInfo) myBaseInfo;
我正在使用 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;
第一个导致编译错误:
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?
当您分配给拥有的变量时,Vala 必须复制该值(在这种情况下,类型不会被引用计数,因此复制是唯一的方法)。这里的问题是复制,而不是转换。将其分配给一个无主变量:
unowned GI.CallableInfo myCallableInfo = (GI.CallableInfo) myBaseInfo;