首页 > 解决方案 > DW 2.0 中的多态性

问题描述

我最近意识到了在 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)
}

说明这些函数的签名和语义是相同的。

这引出了一个问题,如果有的话,这些定义之间有什么区别?你会推荐哪一个?

最后,确认我的假设,即 DW 2.0 借用了这种在 OO 语言中发现的类似泛型的语法来支持显式多态类型。

注意:我确实使用application/dw了从 Anypoint Studio 运行预览时查看函数的信号

蒂亚!

标签: dataweavemule4

解决方案


DataWeave中最常见的用途parametric polymorphism之一是反映类型系统函数,其中它们的返回类型取决于其输入。

这对于避免在实现相同并且它们的签名不同时必须为每种可能的输入类型创建专门的函数很有用。

请注意,此功能仅在类型检查期间相关,此信息在运行时不携带。

在您的示例中:

  • id1a从函数的用法推断出类型id1,也会推断出返回类型,因为它们没有被指定。
  • id2将推断返回类型是类型Any
  • id3并且id4是相同的,返回和a的类型将取决于你调用函数的方式。

为了举例说明和之间的区别AnyT您可以尝试:

// var fails: String = id2("foo")
var ok: String = id3("foo")

由于id2不能将结果分配给 a ,String因为它是Any,但id3返回 aString因为它被赋予了 aString作为输入。


推荐阅读