来自vala教程:
替代迭代器协议:" T? next_value()" 如果迭代器对象有一个返回可空类型的.next_value()函数,那么我们通过调用此函数进行迭代,直到它返回null。
我写了一些代码,但收到了错误。
错误消息:
错误:返回类型`Something.next_value'必须是可以为空的
foreach(A中的字符串s){
^
我不明白,它已经在我的next_value返回类型中可以为空了。
如何更正此代码?
public static void main() {
stdout.printf("hello\n");
var A = new Something<string> ({"aa", "bb"});
foreach (string s in A) {
stdout.puts(s);
stdout.puts ("\n");
}
}
public class Something<T> : Object {
public T[] data;
private int _size;
private int _i = 0;
public Something (owned T[] a){
this.data = a;
this._size = data.length;
}
public Something<T> iterator(){
return this;
}
// error: return type of `Something.next_value' must be nullable
// foreach (string s in A) {
// ^
public T? next_value () {
return _i < _size ? data[_i++] : null;
}
}
答案 0 :(得分:1)
您已声明通用数据类型必须可为空,这是正确的。因此,当您将特定数据类型作为类型参数传递时,请确保它也可以为空。这一行:
var A = new Something<string> ({"aa", "bb"});
应该是:
var A = new Something<string?> ({"aa", "bb"});