首页 > 解决方案 > 如何使用两个对象中最特殊的类型作为返回类型?

问题描述

我基本上想要的是,推断出更专业的类型,如下例所示:

Predicate<Object> first;
Predicate<String> second;

Predicate<String> firstOr = first.or(second);
Predicate<String> secondOr = second.or(first);

的方法签名将如何or(...)实现这一点?

标签: javagenerics

解决方案


这可以通过以下声明来完成Predicate<T>::or

default <R extends T> Predicate<R> or(Predicate<? super R> other) {
    return r -> this.test(r) || other.test(r);
}

这将允许为这两种类型的任何子类型or创建一个。因此,例如,以下将起作用:PredicatePredicate

Predicate<Object> first;
Predicate<Number> second;

Predicate<Integer> firstOr = first.or(second);
Predicate<Integer> secondOr = second.or(first);

推荐阅读