Есть ли способ определить тип суммы в Java? Кажется, что Java, естественно, поддерживает типы продуктов напрямую, и я думал, что перечисления могут позволить ему поддерживать типы сумм, а наследование выглядит, может быть, оно может это сделать, но есть хотя бы один случай, который я не могу решить. Чтобы разработать, тип суммы - это тип, который может иметь ровно один из множества различных типов, например, тегированный союз в C. В моем случае я пытаюсь реализовать haskell. Любой тип в Java:
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 generics:
public class Left<L> extends Either<L,?>
Я много не использовал Java Enums, но пока они кажутся следующим лучшим кандидатом, я не надеюсь.
На данный момент, я думаю, что это может быть возможно только по типу литья Object
значений, которые я хотел бы надеяться, чтобы полностью избежать, если есть способ, чтобы сделать это один раз, безопасно, и быть в состоянии использовать это для всех типов сумм.