有人可以解释一下`List <BaseType>

时间:2019-10-17 17:26:52

标签: dart operators

Dart cheatsheet中,向空感知运算符说

  

在初始化带有子类型内容的列表时,指定类型很方便,但仍然希望列表为List<BaseType>

     

final aListOfBaseType = <BaseType>[SubType(), SubType()];

有人可以详细说明吗?

1 个答案:

答案 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>,则在创建列表对象时需要定义它。