我正在准备OCP证书,并且遇到了下界通配符的想法。如果我正确理解的话,当我们想让Java知道“绑定类型”总是可以添加到我们的通用Collection中时,将使用下界通配符。
例如:
public static void addInteger(List<? super Integer> list, Integer i)
{
list.add(i);
}
public static void main(String[] args)
{
List<Number> list = new ArrayList<>();
addInteger(list, 100);
addInteger(list, 200);
System.out.println(list); // [100,200]
}
Run Code Online (Sandbox Code Playgroud)
由于“?super Integer”指示类型必须是Integer或其父类,因此在每种情况下都可以将Integer添加到列表中。
但是,此代码仍然可以正常编译和运行:
public static void main(String[] args)
{
Predicate<? super String> pred = s -> s.startsWith("M"); // still compiles
System.out.println(pred.test("Mon")); // Output true
}
Run Code Online (Sandbox Code Playgroud)
现在我们有了一个Predicate,它将接受1个参数,它是一个String或其超类,但是我们不确定它实际上是否是一个String(如果它只是一个对象呢?)。但是,我们仍然可以访问startsWith()类似方法s实际上是一个字符串。
为什么会这样?请给我解释一下。