The Dart analyzer can infer types for fields, methods, variables, and more.
But sometimes it needs a little help, and you can use type annotations to ensure variables are of the intended type.
This way, your code won't compile if you use types incorrectly.
Example:
// inferred type: List<dynamic>
final allInts = [1, 6, 2.2, 3, 8.12, 4, 9, 'string'];
// inferred type: List<int>
final allIntsForSure = <int>[1, 6, 2.2, 3, 8.12, 4, 9, 'string'];
allInts.add(5); // ok
allInts.add(5.0); // ok but unintended
allInts.add('I can add anything!'); // ok but unintended
allInts.add(true); // ok but unintended
allIntsForSure.add(5); // ok
allIntsForSure.add(5.0); // error
allIntsForSure.add('Will not compile!'); // error