Vala代码编译报错:为何此处缺失泛型类型参数?
Vala代码编译错误分析与修复
问题场景
尝试编写Vala代码实现:在main函数中创建HashTable<string, int>实例,传入hashtable2list函数,该函数生成所有键的列表并打印。原代码如下:
public static void hashtable2list(HashTable sht){ List lst = new List<string>(); sht.foreach( (key, value) => { lst.append(key); } ); lst.foreach((entry) => {print("%s\n", (string)entry);}); return; } public static void main(){ HashTable <string, int> ht = new HashTable <string, int> (direct_hash, direct_equal); ht.insert("one", 1); ht.insert("two", 2); ht.insert("three", 3); hashtable2list(ht); return; }
编译时出现错误:
$ valac mySegFaultAnother.vala rnSegFaultAnother.vala:5.33-5.35: error: missing generic type arguments sht.foreach( (key, value) => { lst.append(key); } ); ^^^ Compilation failed: 1 error(s), 0 warning(s)
错误原因
核心问题是hashtable2list函数的参数sht没有指定泛型类型参数,导致编译器无法推断foreach回调中key和value的具体类型。当调用lst.append(key)时,lst是明确的List<string>,但key的类型为未确定的untyped,编译器无法确认两者类型兼容,因此报错提示lst缺少泛型参数(本质是类型不匹配导致的推导失败)。
修复方案
方案1:指定具体泛型类型
直接给函数参数sht指定HashTable<string, int>类型,让编译器明确键为string类型,修复后的代码:
public static void hashtable2list(HashTable<string, int> sht){ List<string> lst = new List<string>(); sht.foreach( (string key, int value) => { lst.append(key); } ); lst.foreach((string entry) => {print("%s\n", entry);}); return; } public static void main(){ HashTable <string, int> ht = new HashTable <string, int> (direct_hash, direct_equal); ht.insert("one", 1); ht.insert("two", 2); ht.insert("three", 3); hashtable2list(ht); return; }
方案2:使用泛型函数(更通用)
如果想让hashtable2list支持任意类型的HashTable,可以定义泛型函数,实现跨类型复用:
public static void hashtable2list<K, V>(HashTable<K, V> sht){ List<K> lst = new List<K>(); sht.foreach( (K key, V value) => { lst.append(key); } ); lst.foreach((K entry) => {print("%s\n", entry.to_string());}); return; } public static void main(){ HashTable <string, int> ht = new HashTable <string, int> (direct_hash, direct_equal); ht.insert("one", 1); ht.insert("two", 2); ht.insert("three", 3); hashtable2list(ht); return; }
两种方案均可解决编译错误,方案1适配当前特定场景,方案2扩展性更强。
内容的提问来源于stack exchange,提问作者rnso
相关产品推荐
相关产品推荐

