我最近意识到在 DW 2.0 中使用类泛型表示法来表示多态类型。
下面的例子
%dw 2.0
output application/dw
fun id1(a) = a
fun id2(a: Any) = a
fun id3<T>(a: T) = a
var id4 = <T>(a: T) -> a
---
{
"d1": id1,
"d2": id2,
"d3": id3,
"d4": id4,
r1: id1(10),
r2: id2(10),
r3: id3(10),
r4: id4(10)
}
Run Code Online (Sandbox Code Playgroud)
说明这些函数的签名和语义是相同的。
这就引出了一个问题,如果有的话,这些定义之间有什么区别?你会推荐哪一个?
最后,确认我的假设,即 DW 2.0 借用了在 OO 语言中发现的这种类似泛型的语法来支持显式多态类型。
注意:我确实使用application/dw过以便在从 Anypoint Studio 运行预览时查看函数的信号
蒂亚!
parametric polymorphismDataWeave 中最常见的用途之一是反映在类型系统函数中,它们的返回类型取决于其输入。
这对于避免在实现相同且仅在签名上不同时必须为每种可能的输入类型创建专门函数很有用。
请注意,此功能仅在类型检查时相关,运行时不携带此信息。
在你的例子中:
id1将从函数a的使用中推断出的类型,id1也会推断出返回类型,因为它们没有被指定。id2 将推断返回类型是类型 Anyid3并且id4相同,返回和a的类型将取决于您调用函数的内容。要举例说明和之间的区别Any,T您可以尝试:
// var fails: String = id2("foo")
var ok: String = id3("foo")
Run Code Online (Sandbox Code Playgroud)
由于 的结果id2不能分配给 a ,String因为它是Any,但id3返回 aString因为它被赋予了 aString作为输入。