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