[英]Java constrain parameter to common superclass
我有一个Either<L, R>
类,它表示两种类型之一的值,或者语义上不同的状态。 在某些情况下,无论价值是哪种替代方案,对其进行操作都很有价值。
我想要一个采用Consumer<T>
的(非静态)方法,其中T
是L
和R
的超类型,其中L
和R
是类的类型参数。
目前,java让我这样做:(静态实现)
public static <T, L extends T, R extends T> void collapse(Either<L,R> e, Consumer<T> op)
但是,当然,使用非静态实现,我不能对L
和R
施加约束,因为它们已经为相关实例定义了。 我需要强加于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的答案是一个特别好的解决方案(尊重),因为:
Object
(这是非常宽泛的),你总会找到一个你希望它只是一个小的情况有点宽容; 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.