不幸的是,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);
这就消除了静态类型检查,而这是我不希望的。
1条答案
按热度按时间qnzebej01#
没有解决方法,泛型当前是协变的。您最好可以做的是:
如果
Consumer
类只对consume
起作用,那么它是一个单方法接口,您可以只使用函数类型,并传递函数值。