我需要在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);
^^^^^^^^^^^^^^^^^^^
答案 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不支持。