有界谓词的使用

Use of bounded predicates

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

Predicate<? super String> predicate = s -> s.length() > 3;
Stream.of("cat", "bat", "rat", "doggy").filter(predicate).forEach(System.out::println);

任何人都可以描述我们必须需要这些类型的有界类型谓词的情况吗?

因为 Stream.of(T t...) returns a Stream<T> 并且你输入了 4 Strings,所以 Stream.of("cat", "bat", "rat", "doggy") 的输出将是 Stream<String>.

之后,用一个Predicate<? super String>来过滤一个Stream<String>就顺理成章了。您是否要创建一个包含字符串和数字的列表,但类型为 List<String>(例如,通过这段代码...)

    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);

将在运行时遇到整数时抛出 ClassCastException


至于您想使用? super Something的情况,您可以阅读 linked earlier: Difference between <? super T> and <? extends T> in Java

问题的答案