在Dart cheatsheet中,向空感知运算符说
在初始化带有子类型内容的列表时,指定类型很方便,但仍然希望列表为
List<BaseType>
:
final aListOfBaseType = <BaseType>[SubType(), SubType()];
有人可以详细说明吗?
答案 0 :(得分:1)
您可以在以下示例中看到这一点(输出来自DartPad):
class BaseType {}
class SubType extends BaseType {}
void main() {
final aList = [SubType(), SubType()];
print(aList.runtimeType); // JSArray<SubType>
aList.add(BaseType()); // error: The constructor returns type 'BaseType' that isn't of expected type 'SubType'.
final aListOfBaseType = <BaseType>[SubType(), SubType()];
print(aListOfBaseType.runtimeType); // JSArray<BaseType>
aListOfBaseType.add(BaseType()); // works
}
因此,如果您没有为列表指定任何通用类型,则Dart会尝试自动猜测类型。因此,如果仅使用SubType
个对象初始化列表,则列表的类型将为List<SubType>
。
由于列表定义为List<SubType>
,因此您将无法向列表添加任何BaseType
对象。因此,如果您希望将列表定义为List<BaseType>
,则在创建列表对象时需要定义它。