2017-10-17 8 views
4

Hier ist mein Code.inkompatible Typen: Prädikat <CAP#1> kann nicht in Prädikat <konvertiert werden? 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); 
    } 
} 

Ich erhalte den Fehler incompatible types: Predicate<CAP#1> cannot be converted to Predicate<? super CAP#2>. Kannst du mir helfen, es zu lösen? und warum zeigt es diesen Fehler?

ändere ich dann auch die obigen Zeilen vorbei Argumente als

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

Aber immer noch den Fehler gegenüber.

Antwort

2

sollten Sie zu List<T> list statt List<?> list von ändern

+0

Können Sie erklären, es bitte? – UnKnown

+2

@UnKnown Das Problem bei der Verwendung des Platzhalters '?' Für die Werteliste ist, dass der Compiler nicht weiß, um welchen Typ sich die Elemente in Ihrer 'allMatch'-Methode handelt. Während das 'Prädikat' für' T's ist, könnte die Liste alles enthalten: 'T's,' Objekt's, 'Banana's,' Minion's ... Und der Fehler sagt dir das 'Prädikat 'kann nicht zum Filtern dieser Werte verwendet werden. Mit 'List ' zeigen Sie dem Compiler, dass alle Elemente 'T' sind, und das' Prädikat' kann diese filtern. –

Verwandte Themen