2016-08-13 77 views
-2

我想知道为什么这段代码甚至可以编译。因为这里我们有一个Predicate,它的类型可能是字符串或其任何超级类型。很明显,length()在适用于此谓词的对象类中不可用。使用有界谓词

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

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

+1

也许你应该看看:HTTP://计算器。 com/questions/4343202 /差异之间的超t和扩展-t在java中 – Flown

+2

如果你已经阅读接受的答案,那么你会得到你的答案。 – Flown

回答

4

因为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在运行时碰到Integer。


对于一个情况下,你想要用? super Something,你可以阅读的答案,前面挂的问题@FlownDifference between <? super T> and <? extends T> in Java