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

问题描述 投票:0回答:2
不幸的是,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);

这删除了我不想要的静态类型检查。
    

没有解决方法,泛型目前是协变的。 你能做的最好的事情就是:
dart generics covariance contravariance generic-variance
2个回答
2
投票

等待方差注释(

https://github.com/dart-lang/language/issues/524 类所做的唯一事情就是

consume

,那么它是一个 
单方法接口
,您可以只使用函数类型,并传递函数值。

您可以启用引入类型参数方差注释的

0
投票
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
  • 中将sdk版本设置为
    pubspec.yaml
    将以下内容添加到
    analysis_options.yaml
  • analyzer: enable-experiment: - variance
    
    
    使用 
    --enable-experiment=variance
  • 运行代码
        
© www.soinside.com 2019 - 2024. All rights reserved.