You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对Either的两侧进行类型转换?解决类型不匹配问题

Dart Either 类型转换问题解决方法

问题1:Right<Failure, Concrete> 转 Either<Failure, Abstract>

Dart泛型默认是不变性的,哪怕Concrete继承自Abstract,Right<Failure, Concrete>也没法直接强转为Either<Failure, Abstract>,可以用这两种简便方式处理:

  • 方式一:用Either构造器重包

    // originalRight 为 Right<Failure, Concrete> 类型
    Either<Failure, Abstract> converted = Either.right(originalRight.value);
    
  • 方式二:用map方法链式处理

    Either<Failure, Abstract> converted = originalRight.map(
      (concrete) => concrete, // Concrete自动向上转型为Abstract
      (failure) => failure,
    );
    

问题2:Left<Object, Concrete> 转 Either<Failure, Concrete>

这是Left侧泛型类型不匹配导致的(Object vs Failure),需要把Left中的Object转为Failure类型,可用以下两种方法:

  • 方式一:用mapLeft仅处理Left侧

    // originalLeft 为 Left<Object, Concrete> 类型
    Either<Failure, Concrete> converted = originalLeft.mapLeft((obj) {
      if (obj is Failure) return obj;
      // 处理转换失败场景,比如抛异常或返回默认Failure实例
      throw ArgumentError('Object is not a Failure');
    });
    
  • 方式二:用bimap同时处理两侧(按需使用)

    Either<Failure, Concrete> converted = originalLeft.bimap(
      (obj) {
        if (obj is Failure) return obj;
        throw ArgumentError('Object is not a Failure');
      },
      (concrete) => concrete, // 右侧无需转换,直接返回
    );
    

额外优化提示

如果你的Either实现支持泛型协变,在定义时给右侧类型加上covariant,能直接避免第一种转换问题:

abstract class Either<L, covariant R> {}
class Left<L, R> implements Either<L, R> {}
class Right<L, R> implements Either<L, R> {}

这样Right<Failure, Concrete>可以直接赋值给Either<Failure, Abstract>变量,无需额外转换。

内容的提问来源于stack exchange,提问作者Joaquim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:15:39