繁体   English   中英

Java约束参数到公共超类

[英]Java constrain parameter to common superclass

动机

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

问题

我想要一个采用Consumer<T>的(非静态)方法,其中TLR的超类型,其中LR是类的类型参数。
目前,java让我这样做:(静态实现)

public static <T, L extends T, R extends T> void collapse(Either<L,R> e, Consumer<T> op)

但是,当然,使用非静态实现,我不能对LR施加约束,因为它们已经为相关实例定义了。 我需要强加于T那些约束,但是java不会让我写下面的内容,因为它只允许一个超类型或子类型约束中的一个类。 这是特别令人沮丧的,因为所有类至少共享Object作为常见的超类型,因此这些约束始终是可满足的。

public void collapse(Consumer<? super L & R> op)

有没有其他方法来定义这个约束,在更高版本的java中允许它的任何提示,或任何解释为什么它将是一个突破性的功能?

在您的静态版本中,由于您需要使用者能够接受“L”或“R”类型,因此您实际上不需要这些类型变量: Either<? extends T, ? extends T> e Either<? extends T, ? extends T> e Either<? extends T, ? extends T> e

但除此之外,我会说你的静态版本是你能做的最好的。 Java只是没有特别富有表现力的类型系统。

我不认为Eran的答案是一个特别好的解决方案(尊重),因为:

  1. 它在消费者的界限中进行烘焙:你必须像你期望的那样使用一般界限,除非你只使用Object (这是非常宽泛的),你总会找到一个你希望它只是一个小的情况有点宽容;
  2. 它会您使用Either类型的Either 地方引入额外的类型参数,即使您不需要使用消费者,因为您必须始终提供3个类型参数(即使它们是? )。 第三种类型的参数只是感觉像是残酷的。

我看到静态版本唯一真正的缺点是稍微尴尬的调用约定: Either.collapse(anEither, aConsumer)而不是anEither.collapse(aConsumer) 当然,前者稍微宽松一点......但是它可以做你想要的,所以你可能只需要接受尴尬。

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

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

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM