【发布时间】:2022-12-17 23:15:38
【问题描述】:
我正在寻找一种方法来定义一段数据的通用计算,并在我弄错时让编译器大喊大叫。
来自打字稿世界,你可以这样做:
/**
* Type inferred as:
* Array<{
* a: number;
* b: string;
* c: { d: number; e: string };
* }>
*/
const data = [
{ a: 1, b: "b", c: { d: 4, e: "e" } },
{ a: 2, b: "b", c: { d: 4, e: "e" } },
{ a: 3, b: "b", c: { d: 4, e: "e" } },
];
const result = data
// change the type of c to string
.map(o => ({...o, c: JSON.stringify(o.c)}))
// adding a new field
.map(o => ({...o, d: "new"}))
;
/**
* `result` type is automatically inferred as:
* Array<{
* d: string;
* c: string;
* a: number;
* b: string;
* }>
*/
最后,result 的类型将被正确推断,map 之间的每个类型也会被推断出来。
这里的好处是编译器实际上在帮助发现错误。
您将如何在 Java 中做类似的事情?
我尝试使用一个泛型 Map 对象,它的泛型类型跨越多个较低级别的类型,类似于 JS 字典。但是在这种情况下,编译器并不知道键 X 实际上是类型 Y,因此它在捕获错误方面完全没有用。
我的结论是,不可能在 Java 中进行与 Typescript 中相同类型的静态分析。 Java 编译器不是用来传播和更新未命名类型的,因为它会继续并捕获那些类型的错误。
【问题讨论】:
标签: java generics compiler-errors static-analysis