2017-10-17 14 views
4

Voici mon code.types incompatibles: Le prédicat <CAP#1> ne peut pas être converti en prédicat <? super 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); 
    } 
} 

Je reçois l'erreur incompatible types: Predicate<CAP#1> cannot be converted to Predicate<? super CAP#2>. Pouvez-vous m'aider à le résoudre? et pourquoi il montre cette erreur?

Je change aussi les lignes ci-dessus des arguments passant comme

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

Mais encore face à l'erreur.

Répondre

2

Vous devez changer de List<T> list au lieu de List<?> list

+0

Pouvez-vous expliquer s'il vous plaît? – UnKnown

+2

@UnKnown Le problème avec l'utilisation du caractère générique '?' Pour la liste de valeurs est que le compilateur ne sait pas quel type les éléments sont dans votre méthode 'allMatch'. Alors que le 'Predicate' est pour' T's, la liste pourrait contenir n'importe quoi: 'T's,' Object's, 'Banana's,' Minion's ... Et l'erreur vous dit que le 'Prédicat 'ne peut pas être utilisé pour filtrer ces valeurs. En utilisant 'List ', vous montrez au compilateur que tous les éléments seront 'T', et' Predicate' peut les filtrer. –