Java 泛型与两种泛型父类(super class)型的混淆

标签 java generics

我在 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/

相关文章:

java - 以 XML 定义的 Android Drawables 可以包含路径吗?

c++ - 通用继承和复制构造函数

c# - 如何在 C# 中将递归对象转换为集合?

c# - 泛型类型参数错误

java - 导入 JPA 接口(interface)

java - HttpClient/BufferedReader 返回乱码

java - 是否可以使用枚举通过注释映射 Spring 组件?

java - 如何在面向对象中表示动物园?

java - 未知/通配符 (?) 方法调用中的通用类型

c# - 如何使用泛型而不是继承来拥有多个版本的东西