Generics 有界谓词的使用

Generics 有界谓词的使用,generics,java-8,predicate,Generics,Java 8,Predicate,我想知道为什么这段代码可以编译。因为这里我们有一个谓词,它的类型可以是字符串或它的任何超类型。显然,length()在适合此谓词的对象类中不可用 谓词因为返回一个流并且您正在输入4个字符串s,所以流的输出将是一个流 在那之后,predicate可能是唯一合乎逻辑的:如果你已经阅读了被接受的答案,那么你就会得到你的答案。 Predicate<? super String> predicate = s -> s.length() > 3; Stream.of("cat", "

我想知道为什么这段代码可以编译。因为这里我们有一个
谓词
,它的类型可以是字符串或它的任何超类型。显然,
length()
在适合此谓词的对象类中不可用

谓词因为返回一个
并且您正在输入4个
字符串
s,所以
流的输出将是一个


在那之后,
predicate可能是唯一合乎逻辑的:如果你已经阅读了被接受的答案,那么你就会得到你的答案。
Predicate<? super String> predicate = s -> s.length() > 3;
Stream.of("cat", "bat", "rat", "doggy").filter(predicate).forEach(System.out::println);
    List<String> list = new ArrayList<>();
    list.add("cat");
    list.add("bat");
    list.add("rat");
    list.add("doggy");

    List list2 = list;
    list2.add(1);
list.stream().filter(predicate).forEach(System.out::println);