有界谓词的使用[重复]
Posted
技术标签:
【中文标题】有界谓词的使用[重复]【英文标题】:Use of bounded predicates [duplicate] 【发布时间】:2016-12-20 06:48:26 【问题描述】:我想知道为什么这段代码还能编译。因为这里我们有一个Predicate
,它的类型可以是String 或者它的任何超类型。很明显,length()
在适合这个谓词的对象类中是不可用的。
Predicate<? super String> predicate = s -> s.length() > 3;
Stream.of("cat", "bat", "rat", "doggy").filter(predicate).forEach(System.out::println);
谁能描述我们必须需要这些类型的有界类型谓词的情况?
【问题讨论】:
也许你应该看看:***.com/questions/4343202/… 如果您已经阅读了接受的答案,那么您就会得到答案。 【参考方案1】:因为Stream.of(T t...)
返回一个Stream<T>
,而您输入了4 个String
s,所以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
的情况,你可以阅读之前链接的问题@Flown的答案:Difference between <? super T> and <? extends T> in Java
【讨论】:
以上是关于有界谓词的使用[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 stream().reduce() 基于谓词从一个列表中创建 2 个列表 [重复]