2017-10-17 278 views
4

這是我的代碼。不兼容類型:謂詞<CAP#1>不能轉換爲謂詞<?超級CAP#2>

import java.util.stream.Stream; 
import java.util.List; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.function.Predicate; 

public class StreamMethod{ 
    public static void main(String... args){ 
     List<Integer> data = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8)); 

     allMatch(data, x -> x < 10); 
    } 

    public static <T> void allMatch(List<?> list, Predicate<? super T> predicate){ 
     boolean allSatisfy = list.stream().allMatch(predicate); 
     System.out.println(allSatisfy); 
    } 
} 

我收到錯誤incompatible types: Predicate<CAP#1> cannot be converted to Predicate<? super CAP#2>。你能幫我解決嗎?爲什麼它顯示這個錯誤?

然後我也改變傳遞參數上面的線爲

Predicate<Integer> pred= x -> x < 10; 
allMatch(data, pred); 

但仍然面臨着錯誤。

回答

2

您應更改爲List<T> list,而不是List<?> list

+0

你能解釋一下嗎? – UnKnown

+2

@UnKnown使用通配符「?」作爲值列表的問題是,編譯器不知道哪些類型的元素在'allMatch'方法中。雖然'Predicate'是用於'T's的,這個列表可以包含任何東西:'T''','Object'','Banana''',Minion's ......並且錯誤告訴你'Predicate '不能用來過濾這些值。通過使用'List ',您可以向編譯器顯示所有元素都是'T's,'Predicate'可以過濾這些元素。 –