2016-08-13 109 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