【问题标题】: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);

谁能描述我们必须需要这些类型的有界类型谓词的情况?

【问题讨论】:

标签: generics java-8 predicate


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多