Java 如何使用两个对象中最特殊的类型作为返回类型?
我基本上想要的是,更专业化的类型被推断出来,如下例所示:Java 如何使用两个对象中最特殊的类型作为返回类型?,java,generics,Java,Generics,我基本上想要的是,更专业化的类型被推断出来,如下例所示: Predicate<Object> first; Predicate<String> second; Predicate<String> firstOr = first.or(second); Predicate<String> secondOr = second.or(first); 谓词优先; 谓词二; 谓词firstOr=first.or(second); 谓词secondOr=s
Predicate<Object> first;
Predicate<String> second;
Predicate<String> firstOr = first.or(second);
Predicate<String> secondOr = second.or(first);
谓词优先;
谓词二;
谓词firstOr=first.or(second);
谓词secondOr=second.or(first);
或(…)
的方法签名是如何实现的?我认为需要两个重载才能实现这一点。但是,由于重载之间的唯一区别在于类型参数,它们会因为擦除而发生冲突。因此,您需要对它们进行不同的命名(这将不再使它们成为实际的重载)
这可以是签名:
/* In this case, the input Predicate has the most specific type.
* Use this in the first.or(second) case
*/
public <R extends T> Predicate<R> or1(Predicate<R> pred);
/* In this case, the receiver Predicate has the most specific type.
* Use this in the second.or(first) case
*/
public Predicate<T> or2(Predicate<? super T> pred);
/*在本例中,输入谓词具有最特定的类型。
*在第一种或第二种情况下使用此选项
*/
公共谓词or1(谓词pred);
/*在本例中,接收方谓词具有最特定的类型。
*在第二种或(第一种)情况下使用此选项
*/
公共谓词or2(谓词这可以通过以下声明Predicate::or
实现:
default <R extends T> Predicate<R> or(Predicate<? super R> other) {
return r -> this.test(r) || other.test(r);
}
不太令人满意,但我想这是Java的错,不是你的错:P谢谢你的帮助!这不起作用。我在第一个或(第二个)
上遇到编译错误“Predicate与PredIs不兼容可能是您让classPred
来测试这一点,然后混淆了Predicate
和Pred
?我在手动编写错误消息时混淆了Predicate和Pred。它应该是“Predicate与PredicateAh不兼容,我现在看到了我的错误。我设法将?super T
替换为?super R
。回答很好:)
Predicate<Object> first;
Predicate<Number> second;
Predicate<Integer> firstOr = first.or(second);
Predicate<Integer> secondOr = second.or(first);