我有一个泛型函数,需要创建一个元组来调用一个函数,该函数的参数我不知道它的类型。
这样的东西(本例中的array
除外是由一些外部代码创建的,所以我不能直接应用这个函数):
Result apply<Result, Where>(
Anything[] array,
Callable<Result, Where> fun)
given Where satisfies Anything[] => nothing;
是否有一种类型安全的方法来实现此方法并使用给定的参数调用函数?
答案 0 :(得分:2)
这不能完全类型安全地完成...但是假设数组确实包含正确类型的元素,因为它们应该出现在Where
类型的元组中,以下函数将起到作用: / p>
Tuple<Anything, Anything, Anything> typedTuple({Anything+} array) {
if (exists second = array.rest.first) {
return Tuple(array.first, typedTuple({ second }.chain(array.rest.rest)));
}
else {
return Tuple(array.first, []);
}
}
并将apply实现为:
Result apply<Result, Where>(
[Anything+] array,
Callable<Result, Where> fun)
given Where satisfies Anything[] {
value tuple = typedTuple(array);
assert(is Where tuple);
return fun(*tuple);
}
答案 1 :(得分:0)
array
的类型与fun
的参数没有任何关系,因此签名不可能以类型安全的方式实现。你根本不限制array
的类型;它可以包含任何东西。原则上,类型安全的实现如何处理fun
期望[String, Integer]
但array
为[Boolean+]
的情况?