Dart 类型为'的值;x';can';不能分配给类型为';T';
给定以下代码,我不理解为什么不能将类型为'Foo'的值分配给类型为'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
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
,这是一个运行时错误。为了简单起见,我的示例有点偏颇。所以在这个确切的例子中,我想这可能是不安全的。但事实是,我使用的是颤振,我最终得到了这个精确的解决方案,它实际上对我的用例非常有效。我真傻,你说得对,我完全错过了这一点,谢谢!