有界谓词的使用[重复]

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&lt;T&gt;,而您输入了4 个Strings,所以Stream.of("cat", "bat", "rat", "doggy") 的输出将是一个Stream&lt;String&gt;

之后,Predicate&lt;? super String&gt; 可用于过滤Stream&lt;String&gt; 是合乎逻辑的。您是否要创建一个包含字符串和数字的列表,但输入为List&lt;String&gt;(例如,通过这段代码...)

    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

【讨论】:

以上是关于有界谓词的使用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 XCUIElement 上的谓词等待焦点 [重复]

使用谓词对核心数据进行排序以消除重复

如何使用 stream().reduce() 基于谓词从一个列表中创建 2 个列表 [重复]

java有界通配符理解问题[重复]

删除重复项:如何为 boost::geometry::box 编写排序谓词?

NSFetchedResultsController OR 谓词在 iOS6 上为某些项目返回重复项