提问者:小点点

静态编程语言Map类型和JdbcTemboard. queryForMap()的返回值


我最近遇到了一种静态编程语言/Spring Boot,它显示了一种我不完全理解的行为。

让我们从一个非常像教科书的纯静态编程语言示例开始:

val map: Map<String, Any> = mapOf(
   "name": "John",
   "age": 21,
   "job": null
)

可以理解的是,上面的代码片段会导致编译器错误,提醒我们,由于那个(“job”,null)对,我们实际上正在分配一个Map

现在假设我们在Spring Boot中使用静态编程语言。让我们还假设我们有一个名为PERSON的数据库(例如MySQL)表,其中包含三列:

NAME of type varchar (not nullable)
AGE of type int (not nullable)
JOB of type varchar (nullable)

还假设我们的表中有一行,其数据与我们之前提到的示例数据匹配:

'John', 21, NULL

使用JdbcTemplate实例,我们可以执行以下操作:

val map: Map<String, Any> = jdbcTemplate.queryForMap("SELECT * FROM PERSON WHERE NAME=John")
println(map)

对我来说,令人惊讶的结果是最后一段代码没有错误并打印出来

{NAME=John, AGE=21, JOB=null}

看来我们成功地将一对

这是故意的吗?背后的逻辑是什么?


共1个答案

匿名用户

这是一个Java的互操作性问题。

JVM本身没有不可为空的类型。

这在纯静态编程语言中非常有效,但是在与用Java或其他JVM语言编写的代码进行互操作时也存在边角情况。

特别是,由于类型擦除,泛型已经有了各种尴尬的角落情况。

这是复杂的,因为您在代码中指定了返回类型。

val map = jdbcTemplate.queryForMap("SELECT * FROM PERSON WHERE NAME='John'")

…然后它会推断类型参数为

我想这样做的寓意是不要指定返回类型,除非你确定它是正确的,因为当与非静态编程语言代码互操作时,编译器不能总是检查你是对的!