鉴于以下代码,我不明白为什么会抛出错误 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();
}
答案 0 :(得分:2)
我不明白为什么会抛出错误 A value of type 'Foo' can't be assigned to a variable of type 'T'.
。
T extends Foo
表示 T
可以替代 Foo
(T
的每个实例也是 Foo
),而不是 Foo
可以代替 T
。
T foo = Foo();
是不安全的,因为 Foo()
不一定是 T
; T
可以是派生自 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 的类型系统是名义型有关 - 您不能将超类型的实例分配给子类型。