Java将参数约束为通用超类

Zoe*_*wll 7 java generics type-constraints type-parameter

动机

我有一个Either<L, R>类,它表示两种类型之一的值或语义上不同的状态。在某些情况下,无论值是哪种选择,对其进行操作都是有价值的。

问题

我想要(非静态)方法,它接受Consumer<T>,那里T是两者的超类型LR,其中LR是类的类型的参数。
目前,java让我这样做:(静态实现)

public static <T, L extends T, R extends T> void collapse(Either<L,R> e, Consumer<T> op)
Run Code Online (Sandbox Code Playgroud)

但是,当然,对于非静态实现,我不能对L和施加约束R,因为已经为所讨论的实例定义了约束。我需要施加这些约束T,但是java不允许我编写以下内容,因为它一次只允许一个类在超类型或子类型约束中。鉴于所有类都至少共享Object一个共同的超类型,这尤其令人沮丧,因此这些约束始终可以满足。

public void collapse(Consumer<? super L & R> op)
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以定义此约束,在更高版本的Java中允许使用此约束的任何提示,还是对为什么它将成为破坏性功能的任何解释?

Era*_*ran 2

也许您应该添加T作为类的第三个类型参数:

class Either<T, L extends T, R extends T>
{
    public void collapse(Consumer<T> op) {

    }
}
Run Code Online (Sandbox Code Playgroud)