Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用两个对象中最特殊的类型作为返回类型?_Java_Generics - Fatal编程技术网

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不兼容可能是您让class
Pred
来测试这一点,然后混淆了
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);