是否可以在vala中创建泛型类型的实例

时间:2019-09-03 12:35:41

标签: generics vala

我需要在vala中创建一个泛型类型的实例,但是显然不支持此功能。是否有实现类似行为的替代方法?

class MorningGreater {
        public string greeting;
        public string name;
        public MorningGreater(string _greeting, string _name) {
                greeting = _greeting;
                name = _name;
        }
        public void raining() {
                print(greeting + name + " raining morning");    
        }
}
class NameGreater<T> {
        public NameGreater(string name) {
                ///// This is the problem:
                ///// i can't create an instance of T
                var a = new T("good", name);
                a.raining();
        }
}
int main() {
        new NameGreater<MorningGreater>("Bob");
        return 0;
}

使用valac main.vala编译会出现此错误

main.vala:16.11-16.29: error: `NameGreater.T' is not a class, struct, or error code
        var a = new T("good", name);
                ^^^^^^^^^^^^^^^^^^^

1 个答案:

答案 0 :(得分:1)

不,它甚至不能保证您将要创建对象。如果您做了new NameGreater<int>,该怎么办。当您执行a.raining()时,这也会是一个问题。

可以创建一个实例化您的类并传递该委托的委托:

delegate T Create<T>(String greeting, String name);
class NameGreater<T> {
        public NameGreater(Create<T> creator, string name) {
                ///// This is the problem:
                ///// i can't create an instance of T
                var a = creator("good", name);
                a.raining();
        }
}
int main() {
        new NameGreater<MorningGreater>((g, n) => new MonrningGreater(g, n), "Bob");
        return 0;
}

a.raining()问题需要generic type bound,Vala不支持。