Может кто-нибудь, пожалуйста, объясните "Список <BaseType>" - PullRequest
0 голосов
/ 17 октября 2019

В таблице Dart для операторов с нулевым знанием написано

Указание типов удобно, когда вы инициализируете список с содержимым подтипа, но все же хотите получить списокбыть List<BaseType>:

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

Может кто-нибудь уточнить это?

1 Ответ

1 голос
/ 17 октября 2019

Это можно увидеть в следующем примере (выходные данные получены из 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
}

Поэтому, если вы не укажете универсальный тип для списка, Дарт попытается автоматически угадать тип. Таким образом, если список инициализируется только с SubType объектами, тип списка будет List<SubType>.

Поскольку список определен как List<SubType>, вы не сможете добавить какие-либо BaseTypeобъекты в списке. Поэтому, если вы хотите, чтобы список определялся как List<BaseType>, вам нужно будет определить его при создании объекта списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...