2017-10-17 19 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<?> list

+0

당신이 그것을하시기 바랍니다 설명 할 수 List<T> list 대신 변경해야합니까? – UnKnown

+2

@UnKnown 값리스트에 와일드 카드'? '를 사용할 때의 문제는 컴파일러가 요소가 여러분의'allMatch' 메소드 안에 어떤 타입인지 알지 못한다는 것입니다. 'Predicate'는'T'를위한 것이지만 목록에는'T'','Object's,'Banana's, Minion's 등의 내용이 포함될 수 있습니다 ... 그리고 오류는'Predicate '는 이러한 값을 필터링하는 데 사용할 수 없습니다. 'List '을 사용하면 모든 요소가'T'가 될 것이라는 컴파일러를 보여주고'Predicate'는 그것들을 필터링 할 수 있습니다. –