我最近遇到了一种静态编程语言/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}
看来我们成功地将一对
这是故意的吗?背后的逻辑是什么?
这是一个Java的互操作性问题。
JVM本身没有不可为空的类型。
这在纯静态编程语言中非常有效,但是在与用Java或其他JVM语言编写的代码进行互操作时也存在边角情况。
特别是,由于类型擦除,泛型已经有了各种尴尬的角落情况。
这是复杂的,因为您在代码中指定了返回类型。
val map = jdbcTemplate.queryForMap("SELECT * FROM PERSON WHERE NAME='John'")
…然后它会推断类型参数为
我想这样做的寓意是不要指定返回类型,除非你确定它是正确的,因为当与非静态编程语言代码互操作时,编译器不能总是检查你是对的!