我必须将Java应用程序中的某些类逆向工程为UML 2类图。到目前为止,我已经找到了如何在Jon Skeet提出的整个班级中表示类模板:What is the correct way to represent template classes with UML?。有了这些信息,我反向设计了这样一个类:
public class Foo<T> {
//class fields and methods...
}
现在我试图对一个只有一个方法包含一个通用参数的类进行逆向工程的困境:
public class OtherFoo {
public <T extends Comparable<T>> boolean bar(T x, T y) {
//fancy code goes here...
}
}
你知道如何实现任何UML 2工具吗?我只是想了解这个概念。
答案 0 :(得分:9)
我不知道如何在您选择的工具中执行此操作,但在模型级别,它的工作方式与类完全相同。使用签名创建模板操作。
UML2 superstructure的第17.4.14章为符号指定了这一点:
模板操作的模板参数和模板参数绑定是名称之间的两个列表 操作和操作参数 * LT;能见度&GT; &LT;名称&gt; '&lt;'&lt; template-parameter-list&gt; '&gt;''&lt;&lt;'&lt; binding-expression-list&gt; '&gt;&gt;''('&lt; parameter&gt; [','&lt; parameter&gt;] ** ')'[':'&lt; property-string&gt;]
在你的情况下,让我们首先看一下
的简单案例public <T> boolean bar(T x, T y)
这与
相对应+ bar&lt; T&gt; (x:T,y:T):布尔值
您的原始示例看起来有点复杂,因为模板参数被约束到另一个类Comparable,而另一个类又是一个模板,其参数(我称之为T1)依次绑定到操作的参数。这给了我们
+ bar&lt; T&gt;可比&LT; T1-&GT; T&GT;&GT; (x:T,y:T):布尔值
注意:(一些深入的漫游)UML(以及某种程度上的C ++)指定的模板与Java中的泛型非常不同。它们看起来或多或少相同,但它们的语义上有些 - 有时是微妙的 - 差异可能使它们难以匹配。 UML中最重要的一个是:
模板的使用方式与同类非模板元素的使用方式不同。模板元素可以 仅用于生成绑定元素(例如,模板类不能用作类型化元素的类型)或作为一部分 另一个模板的规范(例如,模板类可以专门化另一个模板类)。
这意味着在UML中,OtherFoo也需要是模板 - 即具有模板签名(具有0个参数)。为了在模板范围之外正确使用操作模板 - 即在活动或类似活动中调用它 - 您首先必须将其绑定到具体操作,而不是使用它。如果您的示例,这意味着: