采用 Producer<T>
Consumer<T>
类的抽象设置。
abstract class Producer<T> {
T produce();
}
abstract class Consumer<T> {
void consume(T item);
}
Producer
中的类型参数应该是协变的,但在Consumer
中它应该是逆变的(具体示例:方法参数是逆变的,返回类型是协变的)。然而,Dart 会自动使
Consumer
中的类型参数成为协变,而无需另外指定。
因此,如果其他代码组件需要,例如,一个
Consumer<num>
,从概念上讲它应该接受一个 Consumer<Object>
,因为如果消费者接受任何对象,它肯定会接受一个数字。但如果我只是写:
void someFunction(Consumer<num> consumer);
这将只接受 Consumer<num>
或 Consumer<int>
、
Consumer<float>
等,这会导致错误。
那么我该怎么写呢? 我想到的一些选择:
void someFunction(Consumer<dynamic> consumer);
这删除了我不想要的静态类型检查。
没有解决方法,泛型目前是协变的。 你能做的最好的事情就是:
等待方差注释(
https://github.com/dart-lang/language/issues/524Consumer
consume
,那么它是一个单方法接口
,您可以只使用函数类型,并传递函数值。您可以启用引入类型参数方差注释的
variance
abstract class Producer<out T> {
T produce();
}
abstract class Consumer<in T> {
void consume(T item);
}
abstract class Intermediary<inout T> {
T handle(T item);
}
要启用此实验:
在
^3.4.0
pubspec.yaml
将以下内容添加到
analysis_options.yaml
analyzer:
enable-experiment:
- variance
使用
--enable-experiment=variance