我不知道如何在您选择的工具中执行此操作,但在模型级别上,它的工作方式与类完全一样。您使用您的签名创建模板操作。
UML2 上层结构的第 17.4.14 章为符号指定了这一点:
模板操作的模板参数和模板参数绑定是操作名称和操作参数之间的两个列表。
*<可见性> <名称> '<' <template-parameter-list> '>' '<<' <binding-expression-list> '>>''( ' <parameter> [','<parameter>]** ')' [':' <属性字符串>]
在你的情况下,让我们先看看简单的情况
public <T> boolean bar(T x, T y)
这将对应于
+ bar<T> (x: T, y: T) : 布尔值
您的原始示例看起来有点复杂,因为模板参数被约束到另一个类 Comparable,而后者又是一个模板,其参数(我称之为 T1)依次绑定到操作的参数。这给了我们
+ bar<T> Comparable<T1->T>> (x: T, y: T) : 布尔值
注意:(前面有点深入的杂乱无章)UML(以及在某种程度上C ++)指定的模板与Java中的泛型完全不同。它们看起来或多或少相同,但它们的语义存在(有时是细微的)差异,这使得两者难以匹配。UML 中最重要的一项是:
模板不能以与同类非模板元素相同的方式使用。模板元素只能用于生成绑定元素(例如,模板类不能用作类型化元素的类型)或作为另一个模板规范的一部分(例如,模板类可以专门化另一个模板类)。
这意味着在 UML 中,OtherFoo 也需要是一个模板——即有一个模板签名(带有 0 个参数)。然后为了在模板范围之外正确使用操作模板——即在一个活动或类似的活动中调用它——你首先必须将它绑定到一个具体的操作,而不是使用它。在您的示例中,这意味着:
- 将 OtherFoo 模板绑定到(匿名)绑定类。
- 绑定栏操作模板到绑定类中的操作。