如何对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
相关产品推荐
相关产品推荐

