Java代码利用参数类型中的协方差和逆变.参数to
应该是一个带有一个参数的函数.参数的类型可以是T
或任何超类型T
.该函数应返回type U
或任何子类型的值U
.
该to
函数将调用mapping
并传递它T
当前保存的类型的值(如果它根本保存任何值),因此参数类型mapping
需要是T
可以分配给它的东西.这包括T
,Object
以及层次结构中它们之间的任何其他类型.
同样,to
将使用结果mapping
获取类型的值U
.Mapping
不必声明为U
具体返回,但它返回的任何类型都需要赋值U
.
在Delphi中无法表达这些约束.你能做的最好是请求使用字面函数类型T
和U
:
function &to(mapping: TFunc): Maybe;
您可以U
通过引入另一个类型参数来表达约束:
function &to(mapping: TFunc): Maybe;
我不知道类型参数是否可以用作同一参数列表中其他参数的约束.我也不确定编译器是否可以推断出该V
上下文中的值,因此调用to
会很麻烦.
另一方面,如果虚方法不能有新的通用参数(如U
),那么约束根本不重要,因为你不能声明方法开始.
然而,根据参考实现,仅存在两个的具体实现Maybe
,所以一种可能性可能是实现to
作为非虚拟函数,然后只手动检查运行时类型.它不会很漂亮.像这样的东西:
if Self is TUnknown then
Result := unknown
else
Result := definitely(mapping(TDefiniteValue(Self).value));