下面的代码给出了一个错误,假设它是预期的,而不是错误
class Bar {}
class Baz extends Bar {}
typedef Foo<T extends Bar> = void Function(T);
void printBaz(Baz baz) => print(baz);
final list = <Foo>[];
class Fiz<T extends Bar> {
final T data;
Fiz(this.data);
}
void main(){
final fiz = Fiz(Baz()); /// of course no problem!
list.add(printBaz);
/// The argument type 'void Function(Baz)' can't be assigned to the parameter type 'void Function(Bar)
}
有人能解释一下typedef
和class
之间似乎不一致的这种行为
的原因吗
还将提供一种规避错误的方法
这是预期行为。这和在list
上打字有关。由于在声明列表时不指定泛型,只指定任何Foo
,因此推断的类型是List<Foo<Bar>>
,因为Bar
是允许Foo
采用的最通用的类型。
printBaz
不知道如何处理Bar
参数,因此无法将其添加到您的列表中,并且会出现linter错误。
这可以通过在声明和初始化列表时在Foo
上提供泛型参数来解决:
final list = <Foo<Baz>>[];