我在 Java 中有一个(可怜的)任一种类型:
public final class Either<L, R> {
final boolean isLeft;
final L l;
final R r;
private Either(final boolean isLeft, final L l, final R r) {
this.isLeft = isLeft;
this.l = l;
this.r = r;
}
// map, right-projection, left-projection, etc.
public static <L, R> Either<L, R> left(final L l) {
return new Either(true, l, null);
}
public static <L, R> Either<L, R> right(final R r) {
return new Either(false, null, r);
}
}
我想添加一个方法来将 L 或 R 连接到某种类型 T
的实例:
public <T extends L & R> T join() {
return isLeft ? (T)l : (T)r;
}
但 Java 不喜欢这种通用约束:T extends L & R
。我如何在 Java 类型系统中表示这个操作?
最佳答案
您只能在 Either
上执行此操作,其中两种类型与您要返回的类型相关。由于通常情况并非如此,因此您需要在静态方法中执行此操作(或者至少,某些方法不在 Either
的实例上):
static <T> T join(Either<? extends T, ? extends T> either) {
return either.isLeft ? either.l : either.r;
}
关于Java 泛型与两种泛型父类(super class)型的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42201692/