Ballerina记录覆盖包含字段:字符串转Record报错转枚举正常的原因?
Ballerina中Record包含字段覆盖的类型差异问题
我在Ballerina中尝试用不同类型覆盖record中的included field时遇到错误,相关错误代码如下:
type Vehicle record { string color; string fuel; }; type Car record { *Vehicle; FuelType fuel; // 此处报错 }; type FuelType record { boolean petrol; boolean diesel; };
我定义了两个record:Vehicle和Car,其中Car包含Vehicle。当我将公共字段fuel的类型从string改为FuelType类型的record时,出现以下错误:
included field 'fuel' of type 'string' cannot be overridden by a field of type 'FuelType': expected a subtype of 'string'.
但当我将其改为枚举FuelTypeEnum时则没有错误,代码如下:
type Car record { *Vehicle; FuelTypeEnum fuel; // 无报错 }; enum FuelTypeEnum { petrol, diesel };
请问为何会出现这两种不同的行为?
原因分析
这两种情况的差异核心在于Ballerina的子类型规则:当你在子record中覆盖父record的包含字段时,新字段的类型必须是原字段类型的子类型。
枚举类型可以通过的原因:
Ballerina中的枚举类型本质是字符串字面量的联合类型,而所有字符串字面量类型都是string的子类型。因此FuelTypeEnum作为这些字面量的集合,自然属于string的子类型,满足覆盖字段时的类型约束,所以不会报错。Record类型报错的原因:
FuelType是一个独立的record类型,它和string之间不存在任何子类型关系——既不是string的子类型,也不是string的父类型。这就违反了覆盖包含字段时的类型要求,因此编译器抛出错误,要求新类型必须是string的子类型。
内容的提问来源于stack exchange,提问作者LochanaJ
相关产品推荐
相关产品推荐

