Pointers Vala中作为返回值的可空指针

Pointers Vala中作为返回值的可空指针,pointers,vala,generic-interface,Pointers,Vala,Generic Interface,假设我们有这样的东西(这只是一个例子) 这段代码工作得非常好,但问题是Foo必须是带有public abstract T*f()的泛型,因此Toto必须实现Foo,但是 `“double”不是受支持的泛型类型参数 (我的第一个问题是“为什么?”,据我所知,我可以毫无问题地使用int作为例子) 所以它是Foo,我需要像double i=(!)*(a.f())这样的东西,但它就是不起作用(在C级别) 错误:无效使用void表达式i=(gdouble)(*(*_tmp1)) 那么如何使用f()方法呢

假设我们有这样的东西(这只是一个例子)

这段代码工作得非常好,但问题是
Foo
必须是带有
public abstract T*f()
的泛型,因此
Toto
必须实现
Foo
,但是

`“double”不是受支持的泛型类型参数

(我的第一个问题是“为什么?”,据我所知,我可以毫无问题地使用int作为例子)

所以它是
Foo
,我需要像
double i=(!)*(a.f())
这样的东西,但它就是不起作用(在C级别)

错误:无效使用void表达式
i=(gdouble)(*(*_tmp1))

那么如何使用
f()
方法呢


(我的vala版本是0.36.3)

首先为什么要在vala中使用指针?(这是不鼓励的,指针使用的语言适用于转角情况。)

Vala中的可空类型是生成的C代码中的指针

因此,解决这一问题的一种方法是:

public interface Foo<T> : GLib.Object {
    public abstract T f();
}

public class Toto : GLib.Object, Foo<double?> {

    private double i;

    public Toto(double i = 0) {
        this.i = i;
    }

    public double? f() {
        return i;
    }

    public static int main(string[] args) {
        Foo<double?> a = new Toto(42.0);
        double? i = a.f();
        stdout.printf("%.3f\n", (!) i);
        return 0;
    }
}

是的,当然,我明白使用指针并不是一个好主意(我不再使用指针了),现在它更像是一个抽象的问题。的确,使用
公共抽象T*f()
一切都正常,但出于某种神秘的原因,我想使用
公共抽象T*f()
,在这种情况下,一切都变得非常混乱。无论如何,谢谢你的回答。在这一点上我和你是一致的,Vala仿制药可能会让人困惑。不过,我很感激瓦拉拥有它们:)。
public interface Foo<T> : GLib.Object {
    public abstract T f();
}

public class Toto : GLib.Object, Foo<double?> {

    private double i;

    public Toto(double i = 0) {
        this.i = i;
    }

    public double? f() {
        return i;
    }

    public static int main(string[] args) {
        Foo<double?> a = new Toto(42.0);
        double? i = a.f();
        stdout.printf("%.3f\n", (!) i);
        return 0;
    }
}
static gdouble* toto_real_f (Foo* base);