Java 泛型与两个泛型超类型的混淆

2024-01-12

我在 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 泛型与两个泛型超类型的混淆 的相关文章

随机推荐