【发布时间】:2018-05-09 08:26:46
【问题描述】:
假设我们有一个声明为Predicate<? super SomeClass> 的谓词。我天真地期望它适用于层次结构上的任何SomeClass 超类,包括Object。
但是这个谓词不适用于Object。我收到以下错误:
Predicate 类型中的方法 test(capture#3-of ? super SomeClass) 不适用于参数(Object)
Demo.
为什么Predicate<? super SomeClass> 不适用于Object 的实例?
代码:
import java.util.*;
import java.lang.*;
import java.io.*;
import java.net.URL;
import java.util.function.Predicate;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Predicate<? super URL> p = u -> u.getFile().isEmpty();
p.test(new Object());
}
}
【问题讨论】:
-
你真的要使用super吗?查看演示中的代码,您似乎想要“?扩展 SomeClass”?
-
@ewramner 这不是实用/真实的代码。我只是想了解
<? super T>的工作原理。 -
@ewramner 我认为您应该能够使用
Object- 我已经证明不是这种情况。 -
仅供参考:PECS,这是一个很好的经验法则。
-
您在代码中需要的是
Predicate<Object>类型的变量,Predicate<? super X>在设计上的行为类似于Predicate<X>,但在选择具体实现时允许更大的灵活性(没有= new Predicate<? super X>(),您必须指定具体类型)。例如,您可以采用Predicate<Object>的实现,因为该代码在 X 上也可以正常工作。这与在test方法中允许任何 T 无关。
标签: java generics java-8 predicate