小编Anh*_*ran的帖子

Java 8下界通配符

我正在准备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实际上是一个字符串。

为什么会这样?请给我解释一下。

java generics java-8

4
推荐指数
1
解决办法
76
查看次数

标签 统计

generics ×1

java ×1

java-8 ×1