dataweave - 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 运行预览时查看函数的信号
蒂亚!
解决方案
DataWeave中最常见的用途parametric polymorphism
之一是反映类型系统函数,其中它们的返回类型取决于其输入。
这对于避免在实现相同并且它们的签名不同时必须为每种可能的输入类型创建专门的函数很有用。
请注意,此功能仅在类型检查期间相关,此信息在运行时不携带。
在您的示例中:
id1
会a
从函数的用法推断出类型id1
,也会推断出返回类型,因为它们没有被指定。id2
将推断返回类型是类型Any
id3
并且id4
是相同的,返回和a
的类型将取决于你调用函数的方式。
为了举例说明和之间的区别Any
,T
您可以尝试:
// var fails: String = id2("foo")
var ok: String = id3("foo")
由于id2
不能将结果分配给 a ,String
因为它是Any
,但id3
返回 aString
因为它被赋予了 aString
作为输入。
推荐阅读
- hibernate - Spring Boot 2 Hibernate 保存并不总是提交
- react-native - React Native 异步字体加载
- html - 使用 img 的标题属性作为图像图例?
- java - Firebase Android读取数据->处理->更新数据“全局变量问题”
- python - 将列表作为熊猫数据框中的列值
- install4j - 静默安装期间的“java.lang.InternalError:意外的 CryptoAPI 失败生成种子”
- sql - 如何使用 LEFT JOIN 仅检索不匹配的结果?
- mongodb - 事务中的猫鼬 findOne():未捕获的类型错误:无法读取未定义的属性“$elemMatch”
- node.js - 使用 DynamoDB 时,我可以在同一个主键下有多个条目吗?
- sql - 使用特殊字符更新查询作为 oracle 表中的数据