我不明白为什么在下面的代码段中注释行没有推断状态为SubState<dynamic>
。
class Commander<T> {
final State<T> state;
Commander(this.state);
void doSomething() {
final state = this.state;
if (state is SubState) {
// print(state.property); // Does not work.
}
}
void doOther() {
final state = this.state;
if (state is SubState<T>) {
print(state.property); // This works.
}
}
}
abstract class State<T> {}
class SubState<T> extends State<T> {
T property;
SubState(this.property);
}
只能将变量提升为其声明类型的子类型。
局部state
变量的(推断)声明类型为State<T>
。 然后,您可以使用SubState
进行is
测试,也就是。SubState<dynamic>
. 由于SubState<dynamic>
不是State<T>
的子类型,它不会促进。 执行is SubState<T>
是检查并提升为子类型。
(正如@jamesdlin指出的那样,这是类型推断的一个已知缺点,如果原始SubState
类型不会自动表示SubState<dynamic>
,可能会更好。