Dart 类型为'的值;x';can';不能分配给类型为';T';

Dart 类型为'的值;x';can';不能分配给类型为';T';,dart,Dart,给定以下代码,我不理解为什么不能将类型为'Foo'的值分配给类型为't'的变量。引发错误 void main () { Bar bar = Bar(); } class Foo { // } class Bar<T extends Foo> { T foo = Foo(); } void main(){ Bar=Bar(); } 福班{ // } 分类栏{ T foo=foo(); } 只要转换类型,您就可以开始了: void main () { Bar bar

给定以下代码,我不理解为什么不能将类型为'Foo'的值分配给类型为't'的变量。引发错误

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

class Foo {
  //
}

class Bar<T extends Foo> {
  T foo = Foo();
}
void main(){
Bar=Bar();
}
福班{
//
}
分类栏{
T foo=foo();
}

只要转换类型,您就可以开始了:

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

class Foo {
  //
}

class Bar<T extends Foo> {
  T foo = Foo() as T;
}
void main(){
Bar=Bar();
}
福班{
//
}
分类栏{
T foo=foo()作为T;
}
我无法详细解释这背后的想法,但这与Dart的类型系统是标称的有关——不能将超类型的实例指定给子类型

我不明白为什么不能将'Foo'类型的值分配给't'类型的变量。错误被抛出

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

class Foo {
  //
}

class Bar<T extends Foo> {
  T foo = Foo();
}
T扩展Foo
意味着
T
可以替代
Foo
T
的每个实例也是
Foo
),而不是说
Foo
可以替代
T

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

类Baz扩展了Foo{
void someBazSpecificMethod(){}
}

现在,如果您使用
Baz
作为
T
,这将相当于
Baz foo=foo()
显然是非法的。

如果
T
不等于
Foo
,这是一个运行时错误。为了简单起见,我的示例有点偏颇。所以在这个确切的例子中,我想这可能是不安全的。但事实是,我使用的是颤振,我最终得到了这个精确的解决方案,它实际上对我的用例非常有效。我真傻,你说得对,我完全错过了这一点,谢谢!