“x”类型的值不能分配给“T”类型的变量

时间:2021-06-02 21:04:56

标签: dart

鉴于以下代码,我不明白为什么会抛出错误 A value of type 'Foo' can't be assigned to a variable of type 'T'.

void main () {
  Bar bar = Bar();
}

class Foo {
  //
}

class Bar<T extends Foo> {
  T foo = Foo();
}

2 个答案:

答案 0 :(得分:2)

<块引用>

我不明白为什么会抛出错误 A value of type 'Foo' can't be assigned to a variable of type 'T'.

T extends Foo 表示 T 可以替代 FooT 的每个实例也是 Foo),而不是 Foo可以代替 T

T foo = Foo(); 是不安全的,因为 Foo() 不一定是 TT 可以是派生自 Foo 的其他类。例如,假设您有:

class Baz extends Foo {
  void someBazSpecificMethod() {}
}

现在,如果您将 Baz 用作 T,那将等同于 Baz foo = Foo();,这显然应该是非法的。

答案 1 :(得分:-1)

只需投射类型,您就可以开始使用了:

void main () {
  Bar bar = Bar();
}

class Foo {
  //
}

class Bar<T extends Foo> {
  T foo = Foo() as T;
}

我无法详细解释这背后的想法,但这与 Dart 的类型系统是名义型有关 - 您不能将超类型的实例分配给子类型。