如何解决Dart中缺少不变/逆变类型参数的问题?

eqqqjvef  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(165)

不幸的是,Dart缺乏(设计上)指定不变或逆变类型参数的能力,那么当我需要它们时,我如何解决它们的缺失呢?
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);

这就消除了静态类型检查,而这是我不希望的。

qnzebej0

qnzebej01#

没有解决方法,泛型当前是协变的。您最好可以做的是:

如果Consumer类只对consume起作用,那么它是一个单方法接口,您可以只使用函数类型,并传递函数值。

相关问题