问题 如何在UML方法中表示泛型参数?


我必须将Java应用程序中的某些类逆向工程为UML 2类图。到目前为止,我已经找到了如何为Jon Skeet提出的全班课程模板表示: 使用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工具吗?我只想了解这个概念。


4648
2018-05-13 15:43


起源

+1,好问题!!!!! - NINCOMPOOP


答案:


我不知道如何在您选择的工具中执行此操作,但在模型级别,它的工作方式与类完全相同。您可以使用签名创建模板操作。

第17.4.14章 UML2上层建筑 为表示法指定:

模板操作的模板参数和模板参数绑定是名称之间的两个列表   操作和操作的参数。
  * <visibility> <name>'<'<template-parameter-list>'>''<<'<binding-expression-list>'>>''('<parameter>   [“” <参数>] ** ')'[':'<property-string>]

在你的情况下,让我们首先看一下简单的例子

public <T> boolean bar(T x, T y)

这将对应于

+ bar <T>(x:T,y:T):布尔值

您的原始示例看起来有点复杂,因为模板参数被约束到另一个类Comparable,而另一个类也是一个模板,其参数(我称之为T1)依次绑定到操作的参数。这给了我们

+ bar <T>可比较<T1-> T >>(x:T,y:T):布尔值


注意: (前面有点深入漫步UML(以及某种程度上的C ++)指定的模板与Java中的泛型非常不同。它们看起来或多或少相同,但它们的语义中有些 - 有时是微妙的 - 差异可能使它们难以匹配。 UML中最重要的一个是:

模板不能以与同类非模板元素相同的方式使用。模板元素可以   仅用于生成绑定元素(例如,模板类不能用作类型化元素的类型)或作为一部分   另一个模板的规范(例如,模板类可以专门化另一个模板类)。

这意味着在UML中,OtherFoo也需要是模板 - 即具有模板签名(具有0个参数)。为了在模板范围之外正确使用操作模板 - 即在活动或类似活动中调用它 - 您首先必须将其绑定到具体操作,而不是使用它。如果是您的示例,这意味着:

  1. 将OtherFoo模板绑定到(匿名)绑定类。
  2. 将条形操作模板绑定到绑定类中的操作。

9
2018-05-14 08:56



我发现这个信息非常有用,很明显是水晶,谢谢。如果你能在JonSkeet的答案中添加两个最新例子的图形,那将对未来的读者有所帮助(查看我的问题上的链接)。 - Luiggi Mendoza
那个表达“+ bar <T>可比较<T1-> T >>(x:T,y:T):布尔值“对我来说很奇怪.T之后的第一个更大的标志是否真的正确?不应该是一个” - >“? - IARI
不,“ - >”表示模板参数绑定,而“>”表示模板参数的类型约束。所以在这种情况下,它并不意味着“将T绑定到Comparable”,而是“将T限制为Comparable的子类型”。有关详细信息,请参阅UML上层结构部分“分类器模板”/“表示法”(UML 2.5的第9.3.4节)。 - Carsten