Java 标记的联合/总和类型
有没有办法在Java中定义求和类型?Java似乎自然地直接支持产品类型,我认为枚举可能允许它支持总和类型,而继承看起来也许可以做到这一点,但至少有一种情况我无法解决。为了详细说明,sum类型是一种类型,它可以恰好具有一组不同类型的一个,就像C中的标记并集一样。在我的情况下,我试图在Java中实现haskell的Ory类型:
data Either a b = Left a | Right b
但是在基本级别,我必须将其实现为产品类型,而忽略其中一个字段:
public class Either<L,R>
{
private L left = null;
private R right = null;
public static <L,R> Either<L,R> right(R right)
{
return new Either<>(null, right);
}
public static <L,R> Either<L,R> left(L left)
{
return new Either<>(left, null);
}
private Either(L left, R right) throws IllegalArgumentException
{
this.left = left;
this.right = right;
if (left != null && right != null)
{
throw new IllegalArgumentException("An Either cannot be created with two values");
}
if (left == right)
{
throw new IllegalArgumentException("An Either cannot be created without a value");
}
}
.
.
.
}
我尝试使用继承来实现这一点,但我必须使用Java泛型不允许的通配符类型参数或等效参数:
public class Left<L> extends Either<L,?>
我没有使用过Java的Enums,但是虽然它们似乎是下一个最佳候选者,但我并不抱有希望。
在这一点上,我认为这可能只能通过类型转换值来实现,我希望完全避免这种情况,除非有一种方法可以安全地执行一次,并且能够将其用于所有求和类型。Object