关于泛型:使用有界谓词

Use of bounded predicates

本问题已经有最佳答案,请猛点这里访问。

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

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

有人能描述一种情况,我们必须需要这些类型的有界类型谓词吗?


因为Stream.of(T t...)返回一个Stream,而您放入4个String,所以Stream.of("cat","bat","rat","doggy")的输出将是一个Stream

在那之后,用Predicate过滤Stream是合乎逻辑的。您是否要创建一个包含字符串和数字的列表,但键入的是List(例如,通过这段代码…)

1
2
3
4
5
6
7
8
    List<String> list = new ArrayList<>();
    list.add("cat");
    list.add("bat");
    list.add("rat");
    list.add("doggy");

    List list2 = list;
    list2.add(1);

然后

1
list.stream().filter(predicate).forEach(System.out::println);

当它到达整数时,将在运行时抛出一个ClassCastException

对于您想使用? super Something的情况,您可以阅读前面"飞行链接"问题的答案:"两者之间的差异是什么?"super t>和<?在爪哇推广T>