制作
Either一个没有字段且只有一个构造函数(私有,无参数,空)的抽象类,并将您的“数据构造函数”(
left和
right静态工厂方法)嵌套在该类中,以便他们可以看到私有构造函数,而其他则不能有效密封型。
使用抽象方法
either来模拟详尽的模式匹配,并适当地覆盖静态工厂方法返回的具体类型。实现方便的方法(如
fromLeft,
fromRight,
bimap,
first,
second而言)
either。
import java.util.Optional;import java.util.function.Function;public abstract class Either<A, B> { private Either() {} public abstract <C> C either(Function<? super A, ? extends C> left,Function<? super B, ? extends C> right); public static <A, B> Either<A, B> left(A value) { return new Either<A, B>() { @Override public <C> C either(Function<? super A, ? extends C> left, Function<? super B, ? extends C> right) { return left.apply(value); } }; } public static <A, B> Either<A, B> right(B value) { return new Either<A, B>() { @Override public <C> C either(Function<? super A, ? extends C> left, Function<? super B, ? extends C> right) { return right.apply(value); } }; } public Optional<A> fromLeft() { return this.either(Optional::of, value -> Optional.empty()); }}愉快而安全!没有办法把它搞砸。因为类型是有效密封的,所以您可以放心,只有两种情况,并且最终每个操作都必须根据
either方法进行定义,这将迫使调用者处理这两种情况。
关于您试图解决的问题
class Left<L> extends Either<L,?>,请考虑签名
<A, B> Either<A, B> left(Avalue)。类型参数
B未出现在参数列表中。因此,考虑到某种类型的值
A,你可以得到一个
Either<A, B>对 任何 类型
B。



