类和typedef之间的行为不一致



下面的代码给出了一个错误,假设它是预期的,而不是错误

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)
}

有人能解释一下typedefclass之间似乎不一致的这种行为
的原因吗

还将提供一种规避错误的方法

这是预期行为。这和在list上打字有关。由于在声明列表时不指定泛型,只指定任何Foo,因此推断的类型是List<Foo<Bar>>,因为Bar是允许Foo采用的最通用的类型。

printBaz不知道如何处理Bar参数,因此无法将其添加到您的列表中,并且会出现linter错误。

这可以通过在声明和初始化列表时在Foo上提供泛型参数来解决:

final list = <Foo<Baz>>[];

最新更新