openlang

Groovy 调用 Java 的 encode() 传 null 报方法歧义,但 Java 这边没问题

我把 CSV 导出循环从 Java 迁到 Groovy,现在遇到 nickname 缺失的那一行,任务就挂了。Java 的 FieldEncoder 有三个 encode 重载(String、Number、Collection),null 应该变成标记 NULL。以前的 Java 代码里 encoder.encode(user.getNickname()) 传 null 完全没问题。

Groovy 这边的代码如下。

def cells = COLUMNS.collect { col -> encoder.encode(row[col]) }

第 3 行没有 nickname 这个 key。报错第一行说方法重载有歧义,参数列表是 [null]。我把 row[col] 打印出来,显示的是 null,所以 map 看起来正常。我还改了 nullToken,没有区别。

是 Groovy 4.0.22 对缺失的 key 返回了什么奇怪的东西,还是不支持 null 标记这个选项?为什么同样是 null,Java 能处理,Groovy 就不行?

谢谢大家帮忙。

从英语翻译查看原文

后续讨论 3

顺着彼此的依据读下去
  1. 固定链接

    Java 在编译期根据静态类型选重载,这里是 String,所以 null 没问题。Groovy 是在运行时分派,单独一个 null 对 String、Number、Collection 的匹配程度完全一样。强转一下,写成 encoder.encode((String) row[col])。或者加一个 encode(Object) 重载也行。

    从英语翻译查看原文
  2. 固定链接

    imke 说得对。Groovy 并没有返回什么奇怪的东西,null 在运行时就是 null。强转,或者用 row[col] as String。我在 Gradle 脚本里调自己写的 Java 工具类时也碰到过同样的问题,挺烦的。我会加一个 encode(Object) 然后在里面处理 null,这样调用处能保持干净。

    encoder.encode(row[col] as String)
    从英语翻译查看原文

同一个问题的其他角度

  1. 只读的 List<Int> 算快照吗?

    List<Int> 是只读视图,不是快照。它只告诉使用方,通过这个引用可以调用哪些操作,并不保证它背后的集合不会变。 比如 val owned = mutableListOf(2, 4)。调用方把 owned 传给一个接收 List<Int> 的函数…

    回复 4最近活动 kotlin
  2. 私有联合类型 case、智能构造函数,remove 之后为什么还是 `Colors []`?

    大家好, 我有一个小型色板编辑器,用了一个三种情形的调色板联合类型。全新的编辑是 NotEntered,主动清空是 Empty,Colors 则持有一个列表。我把这几个 case 设成了私有,只暴露 ofColors,其中 ofColors [] 会…

    回复 1最近活动 fsharphaskell
  3. 用度量单位做低成本的 id

    对整数 id,我一直在试用度量单位来代替单分支联合类型,想在它扩散开之前听听别人的意见。CustomerId of int 除非标上 [<Struct>] 否则会分配内存,而且每次使用都要经过构造器或 match。用 [<Measure>] type…

    回复 1最近活动 fsharp